socks5tcp_connect サブルーチン

目的

SOCKSv5 サーバーに接続し、外部宛先への接続を要求します。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
int socks5tcp_connect (Socket, Dst, DstLen, Svr, SvrLen)
int Socket;
struct sockaddr *Dst;
size_t DstLen;
struct sockaddr *Svr;
size_t SrvLen;

説明

socks5tcp_connect サブルーチンは、 Svrで指定された SOCKSv5 サーバーから Dst への接続を要求します。 正常に実行された場合、 Dst および Svr は、外部接続の実アドレスで上書きされ、後続の Socket への書き込みおよびソケットからの読み取りは、 Svrを介して中継されます。

Socket は、タイプ SOCK_STREAM のオープン・ソケット記述子でなければなりません。 Dst および Svr は、 IPv4 または IPv6 アドレスのいずれかです。

ソケット・アプリケーションは、 COMPAT_43 を定義してコンパイルすることができます。 これにより、 sockaddr 構造体は BSD 4.3 と互換性を持ちます。 詳しくは、 socket.hを参照してください。

パラメーター

項目 説明
ソケット ソケットの固有の名前を指定します。
DST SOCKSv5 サーバーが接続を試みるターゲット・ソケットの外部アドレスを指定します。
DstLength Dst内のアドレス構造体の長さを指定します。
SVR NULL 以外の場合は、中継された接続を要求するために使用する SOCKSv5 サーバーのアドレスを指定します。
SvrLength Svrでアドレス構造の長さを指定します。

戻り値

正常終了すると、 socks5tcp_connect サブルーチンは値 0 を戻し、作成された外部ソケットの実際のエンドポイントを反映するように Dst および Svr を変更します。

socks5tcp_connect サブルーチンが失敗すると、システム・ハンドラーは以下の機能を実行します。

  • 呼び出し元のプログラムに-1を返す。
  • 一般システム・エラーを示すエラー・コードを errno グローバル変数に移動します。
  • 特定の SOCKSv5 エラーを示すエラー・コードを socks5_errno グローバル変数に移動します。
  • Dst および Svr は変更されません。

エラー・コード (errno に入れられます。connect () への基礎となる呼び出しから継承されます)

以下のいずれかのエラーが発生すると、 socks5tcp_connect サブルーチンは失敗します。

エラー 説明
EBADF Socket パラメーターが有効ではありません。
ENOTSOCK Socket パラメーターは、ソケットではなくファイルを参照します。
EADDRNOTAVAIL 指定のアドレスは、ローカル・マシンからは 利用できません。
EAFNOSUPPORT 指定されたアドレス・ファミリーのアドレスは、このソケットでは使用できません。
EISCONN ソケットは既に接続されています。
ETIMEDOUT 接続が確立される前に、接続の確立がタイムアウトになりました。
ECONNREFUSED 接続する試みはリジェクトされました。
ENETUNREACH ネットワークまたはホストへの経路が存在しません。
EADDRINUSE 指定されたアドレスは、既に使用されています。
EFAULT Address パラメーターは、ユーザー・アドレス・スペースの書き込み可能部分にはありません。
EINPROGRESS ソケットは非ブロッキングとしてマークされます。 接続を即時に完了できません。 アプリケーション・プログラムは、接続処理中に書き込むソケットを選択することができます。
EINVAL 指定された引数の 1 つ以上が無効です。
ENETDOWN 指定された物理ネットワークがダウンしています。
ENOSPC 装置またはシステム・テーブルにスペースが残っていません。
ENOTCONN ソケットを接続できませんでした。

エラー・コード ( socks5_errno; SOCKSv5-specific エラーに入れられます)

以下のいずれかのエラーが発生すると、 socks5tcp_connect サブルーチンは失敗します。

エラー 説明
S5_ESRVFAIL 一般的な SOCKSv5 サーバー障害。
S5_EPERM SOCKSv5 サーバー・ルール・セットの拒否。
S5_ENETUNREACH SOCKSv5 サーバーがターゲット・ネットワークに到達できませんでした。
S5_EHOSTUNREACH SOCKSv5 サーバーがターゲット・ホストに到達できませんでした。
S5_ECONNREFUSED SOCKSv5 サーバー接続要求がターゲット・ホストによって拒否されました。
S5_ETIMEDOUT TTL の有効期限が切れたため、 SOCKSv5 サーバー接続が失敗しました。
S5_EOPNOTSUPP コマンドは SOCKSv5 サーバーによってサポートされていません。
S5_EAFNOSUPPORT アドレス・ファミリーが SOCKSv5 サーバーによってサポートされていません。
S5_ENOSERV サーバーが見つかりません。

以下のプログラム・フラグメントは、サーバーのソケットからの接続を要求するための、クライアントによる socks5tcp_connect サブルーチンの使用法を示しています。

struct sockaddr_in svr;
struct sockaddr_in6 dst;
.
.
.
socks5tcp_connect(s,(struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));