10055的含义是由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
现在问题是如何从软硬件上面来解决这个问题,软件方面应该注意哪些地方,硬件的影响主要在哪里?

解决方案 »

  1.   

    post的WSARecv请求里头不要有缓冲区,换句话说,post一个要求接收0字节的IO请求包在完成端口这端收到该包后,用同步调用接收(recv),这样不会锁定内存页面,估计你的问题就可以解决了
      

  2.   

    to icanfeeling:
       我现在是调用wsasend重叠发送时产生这个问题的,非wsarecv,我服务器此时是在向客户端反馈文件块,块大小为4k
      

  3.   

    你的并发数多少?硬件情况说一下是否对每个连接post了一个接收请求?
      

  4.   

    异步WSASend也会锁定内存页面,如果你的异步调用过多,异致锁定的内存页面多的话,那就会出现这个错误(锁定的内存页面不能交换到硬盘交换区),你还是按我刚刚说的,post一个0字节的WSARecv请求试试,应该是可以解决这个问题的,当然你的硬件不能太差。
      

  5.   

    声明一下,本人的这个服务器针对某个客户端套接字发完一包数据一定会等到完成通知,如果发送成功,那么我才会接着发送下一包,否则就不发了.客户端也在收,我发现一般是它收一下,没有收到内容,接着再收也没有用,服务端说重叠失败,压根就没有发送成功.估计这个原因不是客户端问题,而是服务端发送缓冲区的确满了,导致数据根本没有发.异步调用也不多啊,才1000多点,我执行echo时并发接近10000也没有问题,上述情况发生在发送文件的情况下(文件约为4m的mp3文件),以前我起多个同步客户端测试1600并发也没有问题.现在这个客户端也是基于完成端口的.
      

  6.   

    上面我说的楼主还是考虑一下。!!发文件??你一次发送的buffer是多大?大的话,调小一些……1000并发数怎么可能会这样……发文件的源码和处理完成端口IO完成包的源码贴一些上来
      

  7.   

    我用recv接收时,运行了一段时间后也出现了10055错误。缓冲区大小好象没关系,很是困惑。
      

  8.   

    10055错误就是,发生在一个重叠操作没完成的情况下,又发起了一个重叠操作如wsasend,wsares等异步操作。
    解决的根本办法就是避免发生这种重复发起重叠操作的动作。
      

  9.   

    客户端也在收,我发现一般是它收一下,没有收到内容,接着再收也没有用,服务端说重叠失败,压根就没有发送成功
    -----------------------------这说明你的客户端没有完成操作,这是由很多原因引起的。比如,收的不全,或根本没收,这一般是你的代码有问题,主要是因为长度不准造成的。你认为收完了,其实并没有。由于tcp是如果一边没收,另一边是发不过去的,在同步的条件下。解决的办法是找出客户端这边的原因。也可能是服务器端的长度发送不对,导致你客户端的长度检查不对。