由于在TCP协议下,我们有WSAAccept可以做循环来侦听客户端的连接,但是在UDP协议下,我们不能使用WSAAccept这个函数来获取客户端的数据,因此我采用了WSARecvFrom来一直做循环,从而获取客户端的数据。我在使用这个函数的时候,由于SOCKET只有一个,因此一创建了服务端的SOCKET就将该SOCKET与完成端口绑定。这样做了以后,程序几乎不能运行,在WSARecvFrom循环执行以后,2500次以后,SOCKET底层就报错,错误码为10055,不知道是哪个资源没有释放,或者说,这种处理UDP下的完成端口的做法本身就不对,请各位大侠指正。

解决方案 »

  1.   

    完成端口是针对多连接的一个非阻塞模式
    UDP?无连接 有必要用完成端口吗
    建议你换个模式:重叠IO,WSAAsynSelect,WSAEventSelect都可以解决你的问题
      

  2.   

    我刚刚做出来一个UDP的完成端口,感觉挺快的,不知道,有没有人有这方面的指标。
      

  3.   

    UDP没有必要用完成端口。
    完成端口的优势在于多套接字时。
    我什么都不用,一个UDP流量也可以达到80~90Mb
      

  4.   

    真的要使用完成端口也是可以的。在同时监听很多个数据报(UDP)的Socket时候用起来就很方便,我的是需要一台计算机开1000个Socket,大大提高了速度。基本不占多少CPU时间。
      

  5.   

    不好意思借个地盘用一下,可别生气哟!我在服务器端用了IOCP,在一个客户端不停的发数据如循环300次,可在服务器端只接收到一百多次,不知为啥?如果我在客户端的循环里加入
    Sleep(10),就可以接收到300个数据,不知原因,愿高手赐教
      

  6.   

    不会有错丫,我的udp,的完成端口运行的梃好得丫。完成端口的get...是堵塞的丫他没有接收到数据是不返回的,怎么可能会有一直循环的现象那,你是搞错了吧?
      

  7.   

    我觉得楼主对完成端口的理解有错误,怎么会要一直循环呢?只需要投递I/O请求-->等待触发->处理I/O结果-->再投递。10055错误的解释是:An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. 
    应该是你一直循环结果让非分页内存耗尽了吧。
      

  8.   

    我的问题一解决,是我对UDP完成端口的理解有误,一个SOCKET,就不需要多次循环,这样可能是分页内存耗尽了吧。