SocketAsyncEventArgs 缓冲区充满了零

本文关键字:缓冲区 SocketAsyncEventArgs | 更新日期: 2023-09-27 18:35:59

我正在为我的分布式系统编写一个消息层。我正在使用IOCP,即Socket.XXXAsync方法。

这是与我正在做的事情非常接近的事情(事实上,我的接收函数是基于他的):http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

我现在发现,在程序开始时(两个测试服务器相互通信),我每次都会得到许多 SAEA 对象,其中 .缓冲区完全由零填充,但 .字节传输是缓冲区的大小(在我的例子中为 1024)。

这是什么意思?我需要检查特殊情况吗?我的系统将此解释为不完整的消息并继续前进,但我想知道我是否真的丢失了一些数据。我的印象是,如果什么都没有收到,你就不会收到回电。无论如何,我可以在WireShark中看到没有任何零长度的数据包进入。

当我用谷歌搜索它时,我发现了以下内容,但我不确定我的问题是否相同:http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

SocketAsyncEventArgs 缓冲区充满了零

我确定链接示例中发生了什么。它似乎以同步方式使用异步套接字。我在代码中看不到任何回调或类似内容。您可能需要重新考虑是否需要同步或异步套接字:)。

手头的问题源于您的函数在网络传输/接收完成之前尝试读取/写入缓冲区的可能性。尝试使用异步套接字中包含的回调功能。例如

// This goes into your accept function, to begin receiving the data
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length,
        SocketFlags.None, new AsyncCallback(OnRecieveData), socketName);
// In your callback function you know that the socket has finished receiving data
// This callback will fire when the receive is complete.
private void OnRecieveData(IAsyncResult input) {
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast
    inSocket.EndReceive(input);
    // Pull the data out of the socket as you already have before.
    // state.Data.Write ......
}