私は、TCP接続し、データのブロックを送信し、ソケットを閉じる送信者を持っています。 私は、上記を行う最も簡単で信頼できるプログラムを作成したいと思います。様々なMSDNや他の材料の読書に基づかいくつかの質問に今TCPソケットをブロックしてすぐに書き込みを閉じる - それは問題ですか?
// assuming LingerOption(false), NoDelay set to whatever
var client = new TcpClient().Connect(server, port);
var stream = client.GetStream();
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();
:
- 最初は(一般的にはソケットに関連する質問が、.NETで例えば)の心に入ってきますstream.Close()はSocket.Close()を呼び出します。 Socket.Close()は、 immediatelly、廃棄ネットワーク 送信していないバッファデータを閉じると言われています。これは が悪いです。しかし、Socket.Write のドキュメントでは、 ソケットがブロックされている場合(デフォルトでは、 )、すべてのデータが送信されるまで、Socket.Writeはブロック をブロックします。だから 問題はありません。
- 一般的に、 のコードでは、 が送信されたすべてが受信者に届かないという状況が発生する可能性がありますか? (と仮定すると、100%の信頼性 ネットワーク)受信機がReadに達していない場合
したがって、受信者がAcceptの後すぐにReadを開始し、ソケットが閉じられるまで読み込んだとすると、私のコードは何があっても絶対に信頼できますか?ありがとう。 – Borka
@Borka:信頼できるネットワークを想定し、 "Write"の前に "Read"を実行し、受信側に十分なバッファを実行すると、このコードは絶対に信頼できます。 – Isaac
@Isaac - 実際には、これらの仮定が正しいと期待することはできません。 –