非同期接続には次の手順を使用する必要があります:
socket(..., SOCK_NONBLOCK, ...)
でソケットを作成connect(fd, ...)
で接続を開始- 戻り値が
0
でない場合EINPROGRESS
でもありません 、その後エラーで中止 fd
まで待ちます 出力の準備ができたことが通知されますgetsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
でソケットのステータスをチェック- 完了
ループなし - EINTR
を処理したくない場合 .
クライアントを最初に起動すると、エラー ECONNREFUSED
が表示されます。 最後のステップで。このような場合は、ソケットを閉じて最初からやり直してください。
詳細を確認しないと、コードの何が問題なのかを判断するのは困難です。 check_socket
のエラーで中断しないと思います
ノンブロッキング接続が成功するかどうかをテストする方法がいくつかあります。
<オール>参照:UNIX ネットワーク プログラミング V1
D. J. バーンスタインは、非同期 connect()
かどうかをチェックするさまざまなメソッドを集めました。 呼び出しが成功したかどうか。これらの方法の多くは、特定のシステムでは欠点があるため、移植可能なコードを作成するのは予想外に困難です。考えられる方法とその欠点をすべて読みたい場合は、このドキュメントをチェックしてください。
tl;dr バージョンだけが必要な場合、最も移植性の高い方法は次のとおりです:
システムがソケットに書き込み可能であることを通知したら、最初に getpeername()
を呼び出します 接続されているかどうかを確認します。その呼び出しが成功した場合、ソケットが接続され、使用を開始できます。その呼び出しが ENOTCONN
で失敗した場合 、接続に失敗しました。失敗した理由を調べるには、ソケット read(fd, &ch, 1)
から 1 バイトを読み取ってみてください。 、これも失敗しますが、取得するエラーは connect()
から取得するエラーです ノンブロッキングでなければ。