POSIX accept
関数は、受け入れられたソケットの記述子を返します。ただし、代わりにuv_accept
がエラーインジケータを返します。libuvで受け入れられたtcpソケットのファイルディスクリプタを取得するには?
ファイルディスクリプタを取得する方法は?
POSIX accept
関数は、受け入れられたソケットの記述子を返します。ただし、代わりにuv_accept
がエラーインジケータを返します。libuvで受け入れられたtcpソケットのファイルディスクリプタを取得するには?
ファイルディスクリプタを取得する方法は?
質問はわずかとして再定式化することができます。
アウトファイルディスクリプタを抽出ハンドルの
皮肉なことに、これは移行ガイドのセクションのタイトルですo libuv 1.0(詳細はhereを参照してください)。バージョン1.0の前に
は、それは次のようにそれを行うための方法は、ライブラリの内部にアクセスしてお勧めしません。
handle->io_watcher.fd
libuv v1.0を、お勧めの方法は、代わりにuv_fileno
を使用しているので。
文書に記載されている内容は次のとおりです。
相当するプラットフォームに依存するファイル記述子を取得します。
TCP、パイプ、TTY、UDP、およびポーリングの各ハンドルがサポートされています。 [...]
したがって、どのバージョンのlibuvを使用しているかは、ハンドルから取り出す最良の方法です。
クライアントのuv_fileno
機能をクライアントのuv_stream
に使用できます。 Linuxとダーウィンで
次の操作を行うことができるように返さuv_os_fd_t
は、int
の別名である:
uv_tcp_t *client;
int conn_s;
// ...
uv_accept(server, (uv_stream_t*) client);
uv_fileno((uv_handle_t *)client, &conn_s);
printf("%d", conn_s);
これは、スタイルが悪く、 'typedef'が' int'以外のものに変更された場合、未定義の動作を呼び出します。 'uv_handle_t'を使ってコンパイラを変換させます。これにより、コンパイル時に変換の潜在的な問題を報告することができます。 – Olaf
ありがとう、あなたは答えとして書くことができますか? – Midiparse
しかし、私はあなたの懸念を理解していません。コンパイラは、変換に問題があるかどうかを報告します。 タイプ のパラメータに '*長い' 合格 互換性のないポインタ型 'uv_os_fd_t *'(別名 'int型*')[-Wincompatible-ポインタの種類]を:;私は長いconn_s 'に変更した場合、'、それは '警告できますuv_fileno((uv_handle_t *)client、&conn_s); ' – Midiparse