我正在写我的分布式系统中的消息层。 我使用IOCP,即Socket.XXXAsync方法。
这里的东西很接近我在做什么(其实,我的接收功能是基于他): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html
我现在发现的是在程序(两个测试服务器互相交谈)开始我每次都得到一个数字SAEA的物件,.Buffer完全以零填充的,然而.BytesTransferred是大小缓冲区(1024在我的情况)。
这是什么意思? 是否有一个特殊的条件,我需要检查? 我的系统将此解释为一个完整的消息并继续前进,但我想知道如果我确实错过了一些数据。 我的印象是,如果正在接受什么都没有,你没有得到一个回调。 在任何情况下,我可以在Wireshark的看到,有没有在未来任何零长度的数据包。
我发现下面的时候我GOOGLE了它,但我不知道我的问题是一样的: 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
我肯定不是在链接例子回事。 它出现在一个同步的方式来使用异步插座。 我看不到任何回调或类似的代码。 您可能需要重新考虑是否需要同步或异步插座:)。
手头上的问题,从您的功能正在尝试接收已完成网络传输/前读/写缓存的可能性茎。 尝试使用包含在异步的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 ......
}