socks5tcp_accept サブルーチン

目的

前の socks5tcp_bind() 呼び出しからソケットへの着信接続を待機します。

ライブラリー

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

構文

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

説明

socks5tcp_accept サブルーチンは、前の socks5tcp_bind呼び出しで要求された listen ソケットで着信接続が確立されるまでブロックします。 成功すると、 ソケット との間の後続の書き込みおよび読み取りは、 スヴルを介して中継されます。

ソケット は、タイプ SOCK_STREAM のオープン・ソケット記述子でなければなりません。

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

パラメーター

項目 説明
ソケット ソケットの固有の名前を指定します。
DST NULL 以外の場合、着信接続を開始したリモート・クライアントのアドレスを受信するためのバッファー
DstLength ドスト内のアドレス構造体の長さを指定します。
SVR NULL 以外の場合は、中継された接続を要求するために使用する SOCKSv5 サーバーのアドレスを指定します。成功すると、このスペースは着信接続のサーバー・サイド・アドレスで上書きされます。
SvrLength スヴル内のアドレス構造体の長さを指定します。

戻り値

正常終了すると、 socks5tcp_accept サブルーチンは値 0 を戻し、着信外部ソケットの実際のエンドポイントを反映するように ドスト および スヴル を変更します。

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

  • 呼び出し元のプログラムに-1を返す。
  • 一般システム・エラーを示すエラー・コードを エラー番号 グローバル変数に移動します。
  • 特定の SOCKSv5 エラーを示すエラー・コードを socks5_errno グローバル変数に移動します。

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

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

エラー 説明
EBADF ソケット パラメーターが有効ではありません。
EAFNOSUPPORT 指定されたアドレス・ファミリーのアドレスは、このソケットでは使用できません。
ENETUNREACH ネットワークまたはホストへの経路が存在しません。
EFAULT ドスト または スヴル パラメーターは、ユーザー・アドレス・スペースの書き込み可能部分にはありません。
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_EADDRINUSE 要求されたバインド・アドレスはすでに ( SOCKSv5 サーバーで) 使用されています。
S5_ENOSERV サーバーが見つかりません。

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

struct sockaddr_in svr;
struct sockaddr_in dst;
.
.
.
socks5tcp_bind(s,(struct sockaddr*)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr), &res, sizeof(svr));
.
.
.
socks5tcp_accept(s, (struct sockaddr *)&dst, sizeof(dst), (struct sockaddr *)&svr, sizeof(svr));