Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SocketAsyncEventArgs缓冲区已满零_C#_.net_Sockets_Asyncsocket_Io Completion Ports - Fatal编程技术网

C# SocketAsyncEventArgs缓冲区已满零

C# SocketAsyncEventArgs缓冲区已满零,c#,.net,sockets,asyncsocket,io-completion-ports,C#,.net,Sockets,Asyncsocket,Io Completion Ports,我正在为我的分布式系统编写一个消息层。我正在使用IOCP,即Socket.XXXAsync方法 这里有一些非常接近我正在做的事情(事实上,我的接收函数是基于his的): 我现在发现,在程序开始时(两个测试服务器相互交谈),每次我都会得到一些SAEA对象,其中.Buffer完全用零填充,而.bytesttransfered是缓冲区的大小(在我的例子中是1024)。 这是什么意思?是否有特殊情况需要检查?我的系统将其解释为一条不完整的消息,然后继续,但我想知道我是否真的丢失了一些数据。我的印象是,

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

这里有一些非常接近我正在做的事情(事实上,我的接收函数是基于his的):

我现在发现,在程序开始时(两个测试服务器相互交谈),每次我都会得到一些SAEA对象,其中.Buffer完全用零填充,而.bytesttransfered是缓冲区的大小(在我的例子中是1024)。

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

我在谷歌上搜索时发现了以下问题,但我不确定我的问题是否相同:


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

当前问题的原因在于,您的函数可能在网络发送/接收完成之前尝试读取/写入缓冲区。尝试使用异步套接字中包含的回调功能。例如

// 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 ......
}

我没有因为丢失数据而导致任何数据处理错误,所以我认为没有任何损失。但这仍然留下了一个问题,为什么该方法会多次返回而不返回任何内容。如果没有简要的描述(使用代码),很难为您提供所需的解决方案。然而,我有使用套接字的经验,我可以建议使用更高的抽象-网络流。网络流具有您想要使用的所有异步回调功能。看看,这是相同的基础调用吗?听起来很有用。另外,我所指的代码也在链接中。我没有答案,但也许这会提供一些启示:不久前,我和我的朋友在.NET3.5上做一个大学课程的项目。我们遇到了一个奇怪的行为,在一个版本的Windows上,缓冲区是空的,而在另一个版本上,缓冲区充满了零。版本是WinXP和Win7,但我不记得是哪种方式。@Carlos Yes网络服务只是对标准套接字通信的抽象,并扩展到更多新的有用功能。我建议您创建PoC(概念验证)项目并进行尝试。值得一试。回调是SAEA对象上的事件处理程序。实际上,我在运行代码时出现了一些最小的语法错误。您是否可以将接收器代码粘贴到pastebin或类似的程序中,我只看到了您所基于的示例。