以前用两台电脑,一台server,一台client时,client不断的往server上发包时,不会出现这种投递失败的情况,平均客户端一秒钟发包4万左右。服务端正常接收。
    现在十台客户端电脑,同时向一台服务器发包,每个客户端发包频率为每秒1万个包,不间段的发包给服务端,会有一两台客户端显示发送失败,即WSASendto时,投递未成功,返回错误类型,并非WSA_IO_PENDING。
    请高手解答下。谢谢,非常急。

解决方案 »

  1.   

    GetLastError返回码是多少?不停的发送包,是有可能发送失败的。
    发送缓冲区满啊,也会失败。
      

  2.   

    异步操作当然会返回PENDING,再正常不过的一个返回值。
    你期望它应该返回甚么?
    NOERROR?那就用同步或者自己while...Sleep等待它的返回值不是PENDING
      

  3.   

    WSASendto时,投递未成功,返回错误类型,并非WSA_IO_PENDING
    -----------------------------------------------------------
    那你的WSAGetLastError的函数的返回值是什么?
      

  4.   

    大家好,有几天没上网了。很抱歉,服务器是四核的CPU,同时WSAGetLastError函数返回值具体还没看。真不好意思,忙别的事情去了。明天具体看了,再回复大家。谢谢大家的回复。
      

  5.   

    服务器资源耗尽,无法处理接收到的UDP包,UDP包被丢弃后,主机发送ICMP差错报文,导致客户端WSASendto()返回错误
      

  6.   

    用 FormatMessage 看看对应的错误信息是什么。
      

  7.   

    哎,还是我来做好人吧,10055 用 formatMessage 显示出来的错误是由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
      

  8.   

        谢谢大家的帮助啊。我是UDP应用。差点把这个最重要的忘说了。IOCP的处理线程是多个,也可以一个,就是调用GQCS部分的。然后将收到的包放到队列中去,再由N个线程来从这个队列中取包。队列每次从顶上取出一个包。我估计是队列的机制有问题,引起了效率。
        如果将队列的机制改成支持多个线程来生产与多个线程来消费,效率应该会有所提升。我的线程代码是支持的,只是队列没优化成这种。另外,如果将队列改成这种支持多个生产者,多个消费者后,队列中必然会带来锁,因为我要判断哪些是可生产的区域,哪些是可消费的区域。不知道哪位有没有这方面的经验,改成这种后,能带来效率的提升吗?