質問: サーバーに ServerSoket を使用して、 クライアントに Socket を使用して通信するとします。 サーバーはクライアントに10M程度(なんでもいいですけど)のデータを送信して すぐflushして、すぐにsocketをcloseします。 これって、以下の場合正常に処理されるのですか? (flush&closeしたからと言って相手に届いているわけではないので) 相手が一時的に電波不良などで受信できない状態になっていた時や、 TCPのため、データ再送リクエストも深い層で行われるかもしれません。 ですがその場合、サーバー側でsocketはcloseされているので、クライアントが上記の状態になった場合は通信は失敗するのでしょうか? それとも、closeしても、クライアントが正常受信完了するまではVMなどで生きているのでしょうか?
回答: socketはOSで管理されていて、正常完了 または 失敗(タイムアウト) まで裏で頑張ります。仮に一時的電波不良があっても、再送の繰り返すうちに成功すれば、データは無事届くことでしょう。繋がらない状態が続き、再送がタイムアウト設定時間以内に成功しなければ、失敗です。 そのため、「電波不良や地理的に遠い通信相手を考慮して、○秒待ってからcloseしよう」などとアプリケーションが考える必要はありません。 余談として、この挙動を変えたいとき、すなわちclose()から指定時間後に結果にかかわらず接続を殺してしまいたいときには、SO_LINGER という、一般的には推奨されないオプションが一応あります。