我正在写一个TCP服务器来打开一个端口,并与某些刚刚将字符串数据作为字节数组发送的硬件通信。C#如何手动清除TCP套接字缓冲区?
环境是在Unity中,所以我使用异步回调来避免阻止程序。这似乎工作正常,连接是有效的,正确的数据遇到,我可以发送消息到硬件,但套接字缓冲区永远不会清除。当我做Socket.EndReceive(ar)
时,数据只是堆积起来并且不会清空。
异步循环是如何工作的?我不明白为什么这个代码没有完成循环并清除缓冲区。我花了相当多的时间试图了解这个过程,并不知道为什么这个代码不应该工作。
protected TcpListener ListenServer;
protected Socket SimNetSocket;
protected byte[] ReadBuffer = new byte[1024];
protected string MessageBuffer;
[....] [....]
public void BeginReceive()
{
SimNetSocket.BeginReceive(ReadBuffer, 0, ReadBuffer.Length, SocketFlags.None, EndReceive, null);
}
protected void EndReceive(IAsyncResult async)
{
string msg = "";
try { msg = ByteArrayToString(ReadBuffer); }
catch (Exception e) { Debug.LogError(e); }
Debug.Log("RAW RECEIVE: " + msg);
MessageBuffer += msg;
ReadBuffer = new byte[1024];
SimNetSocket.EndReceive(async);
BeginReceive();
}
MessageBuffer
是其在更新循环,其中的消息被处理并无关的问题后清除了堆叠ReadBuffer
复合在套接字上。
再说一次,连接是有效的(代码未显示),通信正在工作。我可以看到数据成功地来自双方,但我无法控制另一端硬件在做什么。它是否需要一些实现来接收这些调用并确认缓冲区可以清除?
我实际上看到的是发送消息的硬件,然后是另一条消息,后来又一条消息堆叠在最后一条消息上。不过,我正在通过上面的代码处理每条消息。所以我很困惑。
EndReceive的问题已经被注意到;还包括:你使用的是什么文本编码?如果它不是ASCII码,那么你会遇到更大的问题 - 看到我对其中一个答案的评论 –
调用构造函数是清除缓冲区:ReadBuffer = new byte [1024]; – jdweng