Async Socket将多条消息作为一个读取

时间:2014-05-29 17:58:57

标签: 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 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表现得像我预期的那样吗?

3 个答案:

答案 0 :(得分:4)

您似乎使用了流式套接字(例如TCP而不是UDP)。

流套接字是流 - 接收方无法判断消息是通过多个发送还是一次发送来发送。

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

答案 1 :(得分:4)

我只想回应Ben说的话,并尝试添加一些额外的信息。我在5 - 6年前遇到了同样的情况,尽可能多地进行了研究,得出的结论是“就是这样”。这是我所拥有的唯一“参考”,或多或少证实:

http://www.xtremevbtalk.com/archive/index.php/t-204348.html

所以我所做的是为每个数据包添加数据包的长度,并在另一端“解析”收到的数据包。

答案 2 :(得分:1)

我使用的是TCPclient套接字类型并遇到了这个问题。它与Nagle algorithm有关。我能够通过将NoDelay属性设置为true来解决问题,即使缓冲区尚未满,也可以立即发送数据。

编辑:再次阅读问题后,我不确定您遇到的问题是否与我相同。我正在向设备发送命令,然后读取响应数据。这是你想要做的,还是你想看看发送了什么?