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

Leo*_*rdo 1 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

在我的“服务器”中,我有以下内容:

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...
Run Code Online (Sandbox Code Playgroud)

我的问题是: aux 是“Test0Test1Test2”...我原以为我的 ReadCallback 会被调用 3 次,每个send调用一次...但它只被调用一次...我必须做些什么才能使 readcallback 起作用正如我所料?

Ben*_*Ben 5

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

流套接字是流 - 接收者不一定能判断消息是通过多次发送还是单次发送发送的。

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


Ren*_*Pet 5

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

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

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