在我的“客户”中,我有以下代码:
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表现得像我预期的那样吗?
答案 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来解决问题,即使缓冲区尚未满,也可以立即发送数据。
编辑:再次阅读问题后,我不确定您遇到的问题是否与我相同。我正在向设备发送命令,然后读取响应数据。这是你想要做的,还是你想看看发送了什么?