uv_tcp_t — TCPハンドル

TCPハンドルは、TCPストリームとTCPサーバーの両方を表します。

uv_tcp_tは、次の型の「サブクラス」です: uv_stream_t。

データ型

type uv_tcp_t

TCPハンドルの型です。

enum uv_tcp_flags

次の関数で使うフラグです: uv_tcp_bind()。

enum uv_tcp_flags {
    /* Used with uv_tcp_bind, when an IPv6 address is used. */
    UV_TCP_IPV6ONLY = 1,

    /* Enable SO_REUSEPORT socket option when binding the handle.
     * This allows completely duplicate bindings by multiple processes
     * or threads if they all set SO_REUSEPORT before binding the port.
     * Incoming connections are distributed across the participating
     * listener sockets.
     *
     * This flag is available only on Linux 3.9+, DragonFlyBSD 3.6+,
     * FreeBSD 12.0+, Solaris 11.4, and AIX 7.2.5+ for now.
     */
    UV_TCP_REUSEPORT = 2,
};

公開メンバー

該当なし

関連項目

次の型のuv_stream_tメンバーも適用されます。

API

int uv_tcp_init(uv_loop_t *loop, uv_tcp_t *handle)

ハンドルを初期化します。この時点ではソケットを作成しません。

int uv_tcp_init_ex(uv_loop_t *loop, uv_tcp_t *handle, unsigned int flags)

指定したフラグでハンドルを初期化します。現在、flagsパラメーターの下位8ビットだけをソケットのドメインとして使い、指定したドメインのソケットを作成します。指定したドメインがAF_UNSPECの場合は、次の関数と同様にソケットを作成しません: uv_tcp_init()。

バージョン1.7.0で追加。

int uv_tcp_open(uv_tcp_t *handle, uv_os_sock_t sock)

既存のファイル記述子またはSOCKETをTCPハンドルとして開きます。

バージョン1.2.1での変更: ファイル記述子を非ブロッキングモードに設定します。

注記

渡したファイル記述子やSOCKETの型は検査しませんが、有効なストリームソケットを表している必要があります。

int uv_tcp_nodelay(uv_tcp_t *handle, int enable)

次のオプションを有効にします: TCP_NODELAY。これによりNagleアルゴリズムを無効にします。

int uv_tcp_keepalive(uv_tcp_t *handle, int enable, unsigned int delay)

TCPキープアライブを有効または無効にします。delayは最初の待ち時間を秒単位で表し、enableが0の場合は無視します。

待ち時間delayに達した後、1秒間隔で10回のプローブを送信します。この手順の最後でも接続が失われたままの場合は、ハンドルを破棄し、対応するコールバックへUV_ETIMEDOUTエラーを渡します。

次の値、delayが1未満の場合は、UV_EINVALを返します。

バージョン1.49.0での変更: 次の値、delayが1未満の場合は、UV_EINVAL`を返します。

int uv_tcp_keepalive_ex(uv_tcp_t *handle, int on, unsigned int idle, unsigned int intvl, unsigned int cnt)

次のソケットオプションをすべて指定して、TCPキープアライブを有効または無効にします: TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT。idleはTCP_KEEPIDLEの値、intvlはTCP_KEEPINTVLの値、cntはTCP_KEEPCNTの値です。onが0の場合は無視します。

TCPキープアライブが有効な場合、idleは、TCPがキープアライブのプローブを送信し始める前に、接続がアイドル状態である必要がある時間を秒単位で表します。intvlは、各プローブの間隔を秒単位で表します。TCPは、cnt回のプローブを送っても相手から応答がない場合、接続を切断します。その後、ハンドルを破棄し、対応するコールバックへUV_ETIMEDOUTエラーを渡します。

次の値、idle、intvl、cntのいずれかが1未満の場合は、UV_EINVALを返します。

バージョン1.52.0での変更: 次のソケットオプションの設定をサポートしました: TCP_KEEPINTVL、TCP_KEEPCNT。

注記

基盤となるOSがソケットオプションをサポートしていることを確認してください。現在サポートしているプラットフォームは次のとおりです。

  • AIX

  • DragonFlyBSD

  • FreeBSD

  • illumos

  • Linux

  • macOS

  • NetBSD

  • Solaris

  • Windows

int uv_tcp_simultaneous_accepts(uv_tcp_t *handle, int enable)

新しいTCP接続を待ち受けるときに、OSがキューに入れる複数の非同期acceptリクエストを同時に扱う機能を有効または無効にします。

この設定は、TCPサーバーの性能を調整するために使います。同時acceptは接続の受け付け速度を大幅に高められるため、既定で有効です。ただし、複数プロセスの構成では、負荷の分配が偏る可能性があります。

int uv_tcp_bind(uv_tcp_t *handle, const struct sockaddr *addr, unsigned int flags)

ハンドルをアドレスとポートにバインドします。

ポートがすでに使われている場合は、次のエラー、UV_EADDRINUSEが、次の関数、uv_listen()またはuv_tcp_connect()から返る可能性があります。ただし、バインドするすべてのソケットで、UV_TCP_REUSEPORTをflagsに指定した場合は例外です。つまり、この関数が成功しても、次の関数、uv_listen()またはuv_tcp_connect()の成功は保証されません。

パラメーター:
  • handle — TCPハンドル。次の関数で初期化しておく必要があります: uv_tcp_init()。

  • addr — バインドするアドレス。初期化済みのstruct sockaddr_inまたはstruct sockaddr_in6を指す必要があります。

  • flags — ソケットをバインドするときの動作を制御するフラグです。UV_TCP_IPV6ONLYをflagsに含めると、デュアルスタックのサポートを無効にし、IPv6だけを使います。UV_TCP_REUSEPORTをflagsに含めると、ソケットオプションSO_REUSEPORTを有効にし、複数のプロセスやスレッドのすべての待ち受けソケットへ、受信する接続を分配する負荷分散機能を使えます。

戻り値:

成功時は0、失敗時は0未満のエラーコードを返します。

バージョン1.49.0での変更: 次のフラグを追加しました: UV_TCP_REUSEPORT。

注記

UV_TCP_REUSEPORTフラグは、現在Linux 3.9以降、DragonFlyBSD 3.6以降、FreeBSD 12.0以降、Solaris 11.4、AIX 7.2.5以降でだけ利用できます。他のプラットフォームでは、この関数はUV_ENOTSUPエラーを返します。

int uv_tcp_getsockname(const uv_tcp_t *handle, struct sockaddr *name, int *namelen)

ハンドルが現在バインドされているアドレスを取得します。nameは、有効で十分な大きさのメモリー領域を指す必要があります。IPv4とIPv6をサポートするため、struct sockaddr_storageを推奨します。

int uv_tcp_getpeername(const uv_tcp_t *handle, struct sockaddr *name, int *namelen)

ハンドルへ接続している相手のアドレスを取得します。nameは、有効で十分な大きさのメモリー領域を指す必要があります。IPv4とIPv6をサポートするため、struct sockaddr_storageを推奨します。

int uv_tcp_connect(uv_connect_t *req, uv_tcp_t *handle, const struct sockaddr *addr, uv_connect_cb cb)

IPv4またはIPv6のTCP接続を確立します。初期化済みのTCPハンドルと、未初期化のuv_connect_tを渡してください。addrは、初期化済みのstruct sockaddr_inまたはstruct sockaddr_in6を指す必要があります。

Windowsでは、addrが未指定アドレス(0.0.0.0または::)を指すように初期化されている場合、localhostを指すように変更します。これはLinuxの動作に合わせるためです。

接続が確立したとき、または接続エラーが発生したときに、コールバックを呼び出します。

バージョン1.19.0での変更: 次のアドレス、0.0.0.0と::をlocalhostへ対応付ける処理を追加しました。

関連項目

次の型のuv_stream_tAPI関数も適用されます。

int uv_tcp_close_reset(uv_tcp_t *handle, uv_close_cb close_cb)

RSTパケットを送信してTCP接続をリセットします。この処理では、ソケットオプションSO_LINGERのlinger間隔を0に設定してから、次の関数を呼び出します: uv_close()。プラットフォーム間の不一致があるため、uv_shutdown()とuv_tcp_close_reset()の呼び出しを混在させることはできません。

バージョン1.32.0で追加。

int uv_socketpair(int type, int protocol, uv_os_sock_t socket_vector[2], int flags0, int flags1)

指定した特性を持つ、接続済みソケットのペアを作成します。得られたハンドルは、uv_tcp_openへ渡したり、uv_spawnで使ったり、他の目的に使ったりできます。

次の値、flags0とflags1に指定できる値は、次のとおりです。

  • UV_NONBLOCK_PIPE: 指定したソケットハンドルを、OVERLAPPEDまたはFIONBIO/O_NONBLOCKのI/O用に開きます。libuvで使うハンドルでは推奨しますが、通常、他の用途では推奨しません。

ドメインがAF_UNIXのsocketpair(2)と同等です。

バージョン1.41.0で追加。