ノンブロッキング ネット ソケットの場合、connect()
0 を返すことができますか?
マニュアルページには、「ソケットが非ブロックであり、接続をすぐに完了できない」場合、-1 を返し、errno を EINPROGRESS に設定すると書かれています。
「ただちに」とは正確にはどういう意味ですか?
この場合connect()
、CAN が 0 を返す場合、どのような状況で成功を表す 0 を返しますか? クライアントとサーバー間のネットワークが非常に良好な場合は? または?
このコンテキストでの「即時」とは、ネットワークを介して別のマシンからデータが受信されるのを待たずにという意味です。すぐに完了できる場合は、ゼロを返すことができます。たとえば、同じマシン上の別のプロセスに接続している場合、カーネルは接続プロセスをすぐに完了できます。
connect(2)
システムコール、つまりカーネルへのエントリです。これは、マルチタスキング OS がプロセスを先取りして他のことを行う機会です。
ここで、TCP について質問していると仮定すると、ノンブロッキング ソケットの場合でも、そうする必要はありませんがconnect(2)
、エントリでプロトコル ハンドシェイクを開始し、ユーザー空間に戻る前にそれが完了しているかどうかを確認するように実装できます。次に、OS ネットワーク スタックはユーザー アプリケーションに関してほとんど非同期で動作するため、プロセスがシステム コールの途中でプリエンプトされ、後で元に戻された場合、ハンドシェイクは既に完了し、成功、ゼロが返される可能性があります。アプリ。