gpt4 book ai didi

C# 如何手动清除 TCP 套接字缓冲区?

转载 作者:可可西里 更新时间:2023-11-01 02:44:47 25 4
gpt4 key购买 nike

我正在编写一个 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 复合问题无关。

同样,连接有效(代码未显示)并且通信肯定有效。我可以看到数据从两侧成功地进出,但我无法控制另一端硬件正在做什么。是否需要一些实现来接收这些调用并确认缓冲区可以清除?

我实际看到的是硬件发送一条消息,然后另一条消息叠加在它的最后一条消息上,一次又一次,一次又一次。不过,我正在通过上面的代码处理每条消息。所以我很困惑。

最佳答案

仅仅因为您要求读取 ReadBuffer.Length 字节并不意味着实际上有多少字节被填充到缓冲区中。您需要保留从 EndReceive 返回的 int 并只从缓冲区中读取该字节数。

public void BeginReceive()
{
SimNetSocket.BeginReceive(ReadBuffer, 0, ReadBuffer.Length, SocketFlags.None, EndReceive, null);
}

protected void EndReceive(IAsyncResult async)
{
string msg = "";

int bytesRead = SimNetSocket.EndReceive(async);
try { msg = ByteArrayToString(ReadBuffer,bytesRead); }
catch (Exception e) { Debug.LogError(e); }

Debug.Log("RAW RECEIVE: " + msg);
MessageBuffer += msg;
//ReadBuffer = new byte[1024]; //Not necessary, you can re-use the old buffer.
BeginReceive();
}

关于C# 如何手动清除 TCP 套接字缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44508721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com