我正在寫一個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