【发布时间】: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