サーバが接続を受信したとき、私はC.accept()関数はどのように機能しますか?
でaccept()
機能についての質問があり、accept()
機能は、クライアントと通信するための新しいソケットを作成し、「古いソケットは、」新しい接続をリッスンしましょう。
次に、サーバーは「新しいソケット」を介してクライアントと通信できることを理解していますが、クライアントは「新しいソケット」について知ることができません。 ?
サーバが接続を受信したとき、私はC.accept()関数はどのように機能しますか?
でaccept()
機能についての質問があり、accept()
機能は、クライアントと通信するための新しいソケットを作成し、「古いソケットは、」新しい接続をリッスンしましょう。
次に、サーバーは「新しいソケット」を介してクライアントと通信できることを理解していますが、クライアントは「新しいソケット」について知ることができません。 ?
リスニングソケットは、ローカルIPとポートにのみ関連付けられ、LISTEN状態です。
反対に、サーバー上の受け入れられたソケット(およびクライアント上の接続されたソケット)は、ローカルIPとポート、リモートIPとポートによって識別され、ESTABLISHED状態です。
クライアント側では、サーバーが接続ソケットとは別のリスニングソケットを使用していても問題ありません。クライアントがconnect
から返ってくるまでには、サーバはaccept
から戻ってきて、それぞれから返されたソケット記述子は互いに通信できます。
サーバの複数のソケットが同じローカルポートで動作する可能性はありますか?彼らはリモートアドレスとポートで区別されますか? – Milack27
@Milackそれは正しいです。リスニングソケットは 'accept 'を複数回呼び出して、複数の接続を受け入れることができます。これらの受け入れられたソケットはすべて同じローカルIPとポートを持ちますが、リモートIPやポートは異なるでしょう。 – dbush
よろしくお願いいたします。しかし、connect()(socket "sock")の後で、クライアントが同じソケット( "sock")上に何かを書き込むと、クライアントの受け入れられたソケットと "新しいソケット"accept()で作成しましたか?つまり、クライアントがaccept()で作成したソケットに自動的に書き込むことはできますか? – Masiwan
ソケットはネットワークプログラミングAPIの抽象です。ワイヤーとクライアントの場合、依然として1つの接続しかなく、サーバーはlisten、acceptなどのネットワークAPIを使用しているかどうか、またはサーバーが他のAPIやrawソケットを使用して接続を確立しているかどうかを確認しません。
説明すると、TCP(TCP/IP送信のエンドポイント)は、カップルのIPaddress/port_numberによって一意に識別されるという説明です。クライアントが接続を要求するとき、クライアントはIPとポート番号を使用してそれを行います。その操作は、SRCIP + SRCPORTをDSTIP + DSTPORTにバインドし、4つの番号(2つのIPと2つのポート)が接続を一意に識別します。したがって、サーバー上の2つのソケットは実際には2つの異なる接続/ストリームを参照します。
IPプロトコル(TCP/IPを含む)での通信は、2つのエンドポイント間で行われます。エンドポイントは常にhost:portです。 TCPの世界では、2つのエンドポイントが接続を識別します。ソケットは、エンドポイントではなく、接続に関連付けられています。
したがって、2つのソケットを2つのaccept()呼び出しから返し、2つの異なる接続を記述することができます。ここで
は、UNIXマシン上でnetstat -an
出力の例です:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 170.44.26.7:22 161.231.133.178:11550 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:33938 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:13875 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:34968 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:44212 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:34967 ESTABLISHED
ここでは、リスニングソケットがあり、そのソケットにaccept()
起因するいくつかの接続(独自のソケットに裏打ちされた各)。
サーバは 'socket()'でサーバを知り、 'connect()'でサーバを指し示す前にクライアントは「新しいソケット」を作成しました。注:バイナリ「ソケットID」は、異なる物理マシン上にある可能性がある異なるプロセス内の異なるメモリ位置を表します。 – ebyrob
クライアントは* old *ソケットについて知りません。 –