【问题标题】:SocketAsyncEventArgs buffer is full of zeroesSocketAsyncEventArgs 缓冲区已满零
【发布时间】:2012-06-05 20:59:06
【问题描述】:

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

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

我现在发现的是,在程序开始时(两个测试服务器相互通信),我每次都会得到一些 SAEA 对象,其中 .Buffer 完全用零填充,但是.BytesTransferred 是缓冲区的大小(在我的例子中是 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

【问题讨论】:

  • 我没有因丢失数据而出现任何数据处理错误,所以我认为没有任何丢失。但这仍然留下了一个问题,为什么该方法会多次返回空无一物。
  • 如果没有您的简要描述(带代码),很难为您提供所需的解决方案。但是我有使用套接字的经验,我可以推荐使用更高的抽象——网络流。 Network Stream 具有您想要使用的所有异步回调功能。看msdn.microsoft.com/en-us/library/…msdn.microsoft.com/en-us/library/…HTH
  • 底层调用是否相同?听起来很有用。另外,我指的代码在链接中。
  • 我没有答案给你,但也许这会提供一些见解:不久前,我和我的朋友在 .NET 3.5 中为大学课程做一个项目。我们遇到了一个奇怪的行为,在一个版本的 Windows 上,缓冲区是空的,而在另一个版本中,缓冲区是零。版本是 WinXP 和 Win7,但我不记得是哪个版本了。
  • @Carlos 是的 Network Service 只是对标准 Socket 通信的抽象,并扩展到更多新的有用功能。我建议您创建 PoC(概念证明)项目并尝试一下。值得一试。

标签: c# .net sockets asyncsocket io-completion-ports


【解决方案1】:

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

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

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

【讨论】:

  • 回调是 SAEA 对象上的事件处理程序。实际上,我运行代码时语法错误很少。
  • 您是否可以将接收器代码粘贴到 pastebin 或类似文件中,我只看到了您所基于的示例。
猜你喜欢
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多