1. ホーム
  2. c

[解決済み] TCPソケットのconnect()がブロックされるか?

2022-02-08 23:54:16

質問

TLPI (The Linux Programming Interface)を読んでいるのですが、connect()について質問させてください。

私の理解では、listen() の保留中の接続数が "backlog" に達していない場合、connect() は直ちにリターンします。 そして、それはそうでなければブロックされます。(図56-2によると)

しかし、TCPソケットの場合は、サーバー側のaccept()が呼ばれるまで、常にブロックされます(図61-5参照)。

ということでよろしいでしょうか? というのも、サンプルコード(P.1265)では、 listen()を呼んで特定のポートをリッスンし、 accept()を呼ぶ前にそのポートにconnect()を呼んでいます。

ということは、この場合connect()は永遠にブロックされますよね?

ありがとうございます!

解決するには?

ネットワークには「すぐに」というものはほとんどなく、途中でモノがなくなったり、理論的にはすぐに行うべき操作が実際にはできなかったり、いずれにしてもエンド・トゥ・エンドの転送時間があります。

しかし

  • TCPソケットのconnect()は、ソケットディスクリプタをノンブロッキングモードにしない限り、ブロッキング操作となります。

  • TCPハンドシェイクはOSが行い、ハンドシェイクが終了するとconnect()が戻ってきます。(つまり connect() は、相手側が accept() を呼び出すまでブロックしない)

  • TCP ハンドシェイクに成功すると、サーバーアプリケーションにキューイングされ、後でいつでも accept() することができます。