none
MSDN的SocketAsyncEventArgs示例程序(套接字性能技术示例),数据包过大不能接受完全的问题 RRS feed

答案

  • 实际测试发现,即使改了前面提到的缓冲区大小,还是有时会出现接收数据不完全的问题(不稳定)。
    现在用的方案是,将缓冲区设置成一个较小的值,发来的数据超过这个值就分几次接收,接收完之后组合成一个完整的数据再使用。

    不过发送过来的数据较大(比如之前说到的40000大小的byte数组),而服务器端设置的缓冲区大小足够一次接收数据的时候,在windows7,以及windows 7与windows server 2003的PC通信的时候,有时会出现只接收了一部分数据的问题(接收的数据大小小于实际发送的数据大小,也小于缓冲区的大小)。在XP系统上测试,没出现过这种问题。这个测试结果让我有点摸不着头脑。

    2010年8月4日 1:39

全部回复

  • private void ProcessAccept(SocketAsyncEventArgs e)
        {
          Interlocked.Increment(ref m_numConnectedSockets);
          Console.WriteLine("Client connection accepted. There are {0} clients connected to the server",
            m_numConnectedSockets);
    
          // Get the socket for the accepted client connection and put it into the 
          //ReadEventArg object user token
          SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop();
          ((AsyncUserToken)readEventArgs.UserToken).Socket = e.AcceptSocket;
    
          // As soon as the client is connected, post a receive to the connection
          bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(readEventArgs);
          if(!willRaiseEvent){
            ProcessReceive(readEventArgs);
          }
    
          // Accept the next connection request
          StartAccept(e);
        }
    

    上面的是原来的代码,e.AcceptSocket使用的是默认值8192。而Server构造函数中传来了一个的参数receiveBufferSize并未用来设置此处e.AcceptSocket的ReceiveBufferSize的值。

    添加如下代码:

    e.AcceptSocket.ReceiveBufferSize = m_receiveBufferSize;
    
    

    即可解决问题。

    “套接字性能技术示例”还有其它不足或者说遗漏,我会整理一篇文章出来。

    2010年7月23日 4:59
  • 缓存不够应该会分成多次截断吧。。。
    成为 Microsoft V Dash了。。。 欢迎各位前辈同事在OCS加我
    2010年7月23日 12:41
    版主
  • 实际测试发现,即使改了前面提到的缓冲区大小,还是有时会出现接收数据不完全的问题(不稳定)。
    现在用的方案是,将缓冲区设置成一个较小的值,发来的数据超过这个值就分几次接收,接收完之后组合成一个完整的数据再使用。

    不过发送过来的数据较大(比如之前说到的40000大小的byte数组),而服务器端设置的缓冲区大小足够一次接收数据的时候,在windows7,以及windows 7与windows server 2003的PC通信的时候,有时会出现只接收了一部分数据的问题(接收的数据大小小于实际发送的数据大小,也小于缓冲区的大小)。在XP系统上测试,没出现过这种问题。这个测试结果让我有点摸不着头脑。

    2010年8月4日 1:39