GNU/Linux >> Linux の 問題 >  >> Linux

Linux、ソケット、ノンブロッキング接続

非同期接続には次の手順を使用する必要があります:

  • socket(..., SOCK_NONBLOCK, ...) でソケットを作成
  • connect(fd, ...) で接続を開始
  • 戻り値が 0 でない場合 EINPROGRESS でもありません 、その後エラーで中止
  • fdまで待ちます 出力の準備ができたことが通知されます
  • getsockopt(fd, SOL_SOCKET, SO_ERROR, ...) でソケットのステータスをチェック
  • 完了

ループなし - EINTR を処理したくない場合 .

クライアントを最初に起動すると、エラー ECONNREFUSED が表示されます。 最後のステップで。このような場合は、ソケットを閉じて最初からやり直してください。

詳細を確認しないと、コードの何が問題なのかを判断するのは困難です。 check_socket のエラーで中断しないと思います


ノンブロッキング接続が成功するかどうかをテストする方法がいくつかあります。

<オール>
  • 最初に getpeername() を呼び出します。エラー ENOTCONN で失敗した場合、接続は失敗しました。 SO_ERROR を指定して getsockopt を呼び出し、ソケットで保留中のエラーを取得します
  • 長さ 0 の read を呼び出します。読み取りが失敗した場合、接続が失敗し、read の errno が接続が失敗した理由を示します。接続が成功した場合、read は 0 を返します
  • 接続を再度呼び出します。 errno が EISCONN の場合、接続は既に接続されており、最初の接続は成功しています。
  • 参照:UNIX ネットワーク プログラミング V1


    D. J. バーンスタインは、非同期 connect() かどうかをチェックするさまざまなメソッドを集めました。 呼び出しが成功したかどうか。これらの方法の多くは、特定のシステムでは欠点があるため、移植可能なコードを作成するのは予想外に困難です。考えられる方法とその欠点をすべて読みたい場合は、このドキュメントをチェックしてください。

    tl;dr バージョンだけが必要な場合、最も移植性の高い方法は次のとおりです:

    システムがソケットに書き込み可能であることを通知したら、最初に getpeername() を呼び出します 接続されているかどうかを確認します。その呼び出しが成功した場合、ソケットが接続され、使用を開始できます。その呼び出しが ENOTCONN で失敗した場合 、接続に失敗しました。失敗した理由を調べるには、ソケット read(fd, &ch, 1) から 1 バイトを読み取ってみてください。 、これも失敗しますが、取得するエラーは connect() から取得するエラーです ノンブロッキングでなければ。


    Linux
    1. OpenSSHを使用してLinuxサーバーに接続する方法

    2. LinuxまたはMacOSXでSSHを使用してサーバーに接続します

    3. Linux ノンブロッキング fifo (オンデマンド ロギング)

    1. Linux OS で開かれているすべてのソケットをチェックする

    2. 最速の Linux システム コール

    3. IP ではなく名前で Linux に接続する

    1. C の Linux でノンブロッキング コンソール I/O を行うにはどうすればよいですか?

    2. Linux CLI 接続マネージャー?

    3. 2.6カーネルLinuxでのフォークとクローン