【发布时间】:2013-03-07 07:50:20
【问题描述】:
我使用 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 个字节已完全发送)?
感谢您的见解。
【问题讨论】:
-
“这显然行不通”是对您所面临问题的非常纯粹的解释...尝试编辑您的帖子以使其更具体。
-
同意。 “这不起作用”是什么意思?你没有收到消息?您没有收到消息的第二部分?你的解析逻辑失败了?还有什么?
-
我收到了一条损坏的消息,在阅读了 selbie 的回答后,这是有道理的。
标签: c# sockets tcp client-server