ソケットAPIは、TCP / IPおよびUDP / IP通信(つまり、私たちが知っているネットワークコード)の事実上の標準です。ただし、そのコア機能の1つは、accept()
少し不思議です。
セミフォーマルな定義を借用するには:
accept()はサーバー側で使用されます。リモートクライアントから新しいTCP接続を作成するために受信した着信試行を受け入れ、この接続のソケットアドレスペアに関連付けられた新しいソケットを作成します。
つまり、accept
サーバーが新しく接続されたクライアントと通信できる新しいソケットを返します。(accept
呼び出された)古いソケットは開いたままで、同じポートで新しい接続をリッスンします。
どのように機能しaccept
ますか?どのように実装されていますか?このトピックについては多くの混乱があります。多くの人が受け入れて新しいポートを開いたと主張し、あなたはそれを通してクライアントと通信します。しかし、新しいポートが開かれていないため、これは明らかに真実ではありません。実際には、同じポートを介して異なるクライアントと通信できますが、どうやって?複数のスレッドrecv
が同じポートを呼び出す場合、データはどこに行くべきかをどのようにして知るのでしょうか?
それは、ソケット記述子に関連付けられているクライアントのアドレスの行に沿ったものだと思います。データがrecv
それを通過するときはいつでも、正しいソケットにルーティングされますが、よくわかりません。
このメカニズムの内部の仕組みについて徹底的に説明していただければ幸いです。