C# を使用してクライアント サーバー アプリケーションを作成しました。
クライアントはメッセージ サイズを定義する 4 バイトのヘッダーを含むメッセージを非同期的に送信し、サーバーはメッセージ全体を待機して(サイズを認識)、DataReceived
イベントを発生させます。データを非同期で送受信すると、これはすべて正常に機能します。
ある時点で、接続不良をシミュレートしたいと考えていました。この接続では、2 つのセグメントが次から次へと送信されましたSend()
。BeginSend()
public void SendSyncString(string str, Commands cmd)
{
BinaryWriter bw = new BinaryWriter(new MemoryStream());
bw.Write((int)cmd);
bw.Write((int)str.Length);
bw.Write(Encoding.ASCII.GetBytes(str));
bw.Close();
byte[] data = ((MemoryStream)(bw.BaseStream)).ToArray();
bw.BaseStream.Dispose();
SendSync(data,1);
}
public void SendSync(byte[] data,int delay)
{
//create |dataLength|data| segment
byte[] dataWithHeader = Combine(BitConverter.GetBytes(data.Length), data);
//send first block of data, delay, and then send the rest
socket.Send(dataWithHeader, 0, 4, SocketFlags.None);
Thread.Sleep(delay*1000);
socket.Send(dataWithHeader, 5, dataWithHeader.Length - 5, SocketFlags.None);
}
これはうまくいきません。しかし、その理由を理解したいと思います。TCP が単なるバイト ストリームであり、各セグメントがいつ到着するかを知る方法がない場合、必要に応じてセグメントに分割し、上記のように単純に送信できないのはなぜですか (最初の 4 バイトが完全に送信されました)?
洞察をありがとう。