2016-05-20 3 views
1

socket()システムコールで作成したソケットがあるとします。その後、私はconnect()を行い、データの送受信を開始しました。send()/ recv()が失敗したとき。ソケットはどこにありますか?

同様に、もう一方の側では、socket()システムコールでソケットが作成され、次にbind(),listen()およびaccept()が呼び出されました。それから、この側もコミュニケーションを始めました。

ここで、send()(したがって、反対側のrecv())のいずれかが失敗したとします。

失敗した後にそのソケットがどこに欲しいですか?

再び通信するために、私は再びソケットを作成し、(他の側にbind()listen()accept()connect()を行う必要がありますか、私は再びsend()recv()を試すことができますか?さらに、そのようなシナリオで実行するのが最善のことは何ですか?

注:send()/recv()が失敗する理由はわかりません。物理的なワイヤーブレイクから他の側への拒否(おそらくiptablesを使用して)は何でもかまいません。

答えて

2

何をするかは、なぜsendまたはrecvが失敗したかによってまったく異なります。

エラーが検出されたら、errnoの値をチェックして理由を調べます。たとえば、エラーコードがEAGAINの場合は操作を再試行し、エラーコードがECONNRESETの場合は再接続する必要があります。

返されるエラーとその対処方法の詳細については、およびrecvのマニュアルページを参照してください。

+0

壊れたネットワークから復旧すると、すべての戻り値がチェックされ、それに応じて手順が実行されますか? – Haris

+0

@Harisあなたがチェックしたいと思うのは、 'send'が-1を返し、' errno'が 'ECONNRESET'です。他の値については、もう一度やり直すのが安全です。 – dbush

+0

ありがとう。それが助けになりました。 – Haris

関連する問題