2017-02-05 18 views
4

socket()でソケットを作成した後、bind()listen()を使用しました。次に、サーバーをシャットダウンした場合にクライアントが接続された後に、クライアント要求を待機するためにaccept()を使用します(たとえば、プロセスをCtrl + Cキーで押すなど)。ソケットとaccept()に関するいくつかの質問

  1. クライアントはまだポートに接続されていますか?
  2. 何らかの形でソケットへの接続を再確立できますか?
  3. これはクライアント側の問題でもありますか?または、recvfrom()誰かがソケットに戻ってくるのを待つのですか?

答えて

3

私はTCPを使用していると仮定します。

サーバー我々シャットダウンした場合:

  1. はまだポートに接続されたクライアントはありますか?

    いいえ。サーバー側のオペレーティングシステムは、サーバーが終了したことに気付き、接続を終了してクライアントにパケットを送信し、接続を終了します。これが起こらない場合(ネットワークに障害が発生しても)、接続は使用できなくなり、クライアントが初めて何かを送信すると、接続が失われたことがわかります。一部のプログラムでは、TCP Keep-Aliveを使用したり、ハートビートメッセージを送信して、サーバーがなくなった場合に通知します。

  2. 何らかの形でソケットへの接続を再確立できますか?

    いいえ。クライアントは新しい接続を確立する必要があります。

  3. これはクライアント側の問題ですか?または、recvfrom()は誰かがソケットにバインドするのを待つか?

    recvfrom()このような方法では待機しません。サーバーは、あなたが暗示している方法で「再接続」または「再結合」することはできません。クライアントは明示的に再接続することによって切断に応答する必要があります。

+0

彼は 'listen()'と 'accept()'を使用しています。前提は必要ありません。 – EJP

+2

お返事いただきました情報と時間をありがとうございます。 –

+0

@EJP:OPはSCTPを使用している可能性があります:https://linux.die.net/man/7/sctp - TCPと同じ機能を使用します。明らかにTCPは可能性が高いですが、それは確かに前提です。 –

2

まだポートに接続されたクライアントですか?

Windowsでは読み取り時にクライアントがリセットされ、* nixで読み取るときはEOS、書き込み時にはリセットされます。

何らかの形でソケットへの接続を再確立できますか?

ポート。クライアントは再接続を試みることができますが、サーバーが実行されてリッスンするまでは成功しません。サーバーは再起動後に何もできません。

これはクライアント側の問題でもありますか?

はい、上記を参照してください。

recvfrom()誰かがソケットに戻ってくるのを待つのですか?

確かにそうではありません。

NBストリームソケットにはrecv()を使用する必要があります。ソケット上のgetpeername()を介してすでに利用可能であるため、送信元アドレス情報recvfrom()は必要ありません。

+3

お返事をいただきありがとうございました。ありがとうございました。 –

+2

@MakisMandrelasありがとうございます。残念なことに、ここでそれらを手に入れることはまれであり、回答者が答える時間を誰かが認めることさえ稀です。ジョンと私の両方へのあなたの礼儀は非常に感謝しています。 – EJP

関連する問題