C# 异步套接字将多条消息作为一条消息读取

C# 异步套接字将多条消息作为一条消息读取,c#,.net,sockets,C#,.net,Sockets,在我的“客户”中,我有以下代码: socket.Send(ASCIIEncoding.UTF8.GetBytes("Test0"), SocketFlags.None); socket.Send(ASCIIEncoding.UTF8.GetBytes("Test1"), SocketFlags.None); socket.Send(ASCIIEncoding.UTF8.GetBytes("Test2"), SocketFlags.None); 在我的“服务器”中,我有以下内容: public

在我的“客户”中,我有以下代码:

socket.Send(ASCIIEncoding.UTF8.GetBytes("Test0"), SocketFlags.None);
socket.Send(ASCIIEncoding.UTF8.GetBytes("Test1"), SocketFlags.None);
socket.Send(ASCIIEncoding.UTF8.GetBytes("Test2"), SocketFlags.None);
在我的“服务器”中,我有以下内容:

public void ReadCallback(IAsyncResult ar)
{
     StateObject state = (StateObject)ar.AsyncState;
     Socket handler = state.WorkSocket;

     int read = handler.EndReceive(ar);

     if (read > 0)
     {
        string aux = Encoding.ASCII.GetString(state.buffer, 0, read);
        //Rest of the code...

我的问题是:aux是“Test0Test1Test2”。。。我希望我的ReadCallback会被调用3次,每次
send
。。。但它只被称为一次。。。我该怎么做才能使readcallback按我的预期运行?

您似乎在使用流类型套接字(例如TCP而不是UDP)

流套接字是流-接收方不一定能判断消息是通过多次发送还是在一次发送中发送的


如果需要分离消息,则需要使用面向数据包或面向消息的协议,或者实现自己的方法来显示消息的开始和结束位置。

您似乎在使用流类型套接字(例如TCP而不是UDP)

流套接字是流-接收方不一定能判断消息是通过多次发送还是在一次发送中发送的


如果您需要分离消息,您需要使用面向数据包或面向消息的协议,或者实现您自己的方法来显示消息的开始和结束位置。

我只是重复Ben所说的,并尝试添加一点附加信息。5-6年前,我遇到了同样的情况,我尽可能多地进行了研究,得出结论“事情就是这样”。这是我唯一的“参考资料”,或多或少证实了:


因此,我所做的是在每个数据包前面加上数据包的长度,然后在另一端“解析”接收到的数据包。

我将重复本所说的,并尝试添加一点额外的信息。5-6年前,我遇到了同样的情况,我尽可能多地进行了研究,得出结论“事情就是这样”。这是我唯一的“参考资料”,或多或少证实了:


因此,我所做的是在每个数据包前面加上数据包的长度,然后在另一端“解析”接收到的数据包。

我使用的是TCPclient套接字类型,因此出现了这个问题。这是和天气有关的。我可以通过将NoDelay属性设置为true来解决这个问题,这样即使缓冲区尚未满,也可以立即发送数据


编辑:在再次阅读问题后,我不确定你是否有与我相同的问题。我向设备发送命令,然后读取响应数据。这是您正在尝试执行的操作,还是您正在尝试查看发送的内容?

我使用的是TCPclient套接字类型,出现了此问题。这是和天气有关的。我可以通过将NoDelay属性设置为true来解决这个问题,这样即使缓冲区尚未满,也可以立即发送数据


编辑:在再次阅读问题后,我不确定你是否有与我相同的问题。我向设备发送命令,然后读取响应数据。这是您正在尝试执行的操作,还是您正在尝试查看发送的内容?

您使用的是哪种类型的套接字?TCP套接字?您使用的是什么类型的套接字?TCP套接字?我正在使用SocketType.Stream确实。。。那我应该用哪一种?德格拉姆?阅读描述我认为我应该使用“Seqpacket”,但它引发了一个异常…我使用的是SocketType.Stream确实。。。那我应该用哪一种?德格拉姆?阅读描述我认为我应该使用“Seqpacket”,但它抛出了一个异常。。。