顺道问一下大家,好像网上讨论比较多的是用完成端口来处理TCP的发送接收.
我想问一下,如果用UDP呢?我做了一个把UDP套接字关联到完成端口,发现了一些问题,就
是我投递了一个WSARecvFrom请求后,这时如果有另一客户端发送数据过来,GetQueuedCompletionStatus
会被激活,能够正常收到数据.
出现的问题是:
1.如果服务端UDP套接字直接给某个客户端发送数据,而该客户端不存在,会导致
上面的GetQueuedCompletionStatus会被激活,但返回错误,数据大小为0,
而且再投递WSARecvFrom请求,即使没有客户端发送数据,也会立即收到GetQueuedCompletionStatus
返回的错误消息,最终导致再也无法接收客户端数据,但发送还可以.2.如果服务端UDP套接字直接给某个客户端发送数据,而该客户端存在,刚一切正常.3.如果发送广播出去,即投递WSASendTo发送了一个广播,GetQueuedCompletionStatus
收不到发送完成的消息,为何?

解决方案 »

  1.   

    我是这样做的.
    1.先创建了UDP套接字
    2.关联到一个完成端口.
    3.调用WSARecvFrom投递一个请求
    4.跟完成端口关联的线程中调用GetQueuedCompletionStatus等待消息
    5.此时如有客户端发送UDP数据过来,一切正常,GetQueuedCompletionStatus返回收到数据消息,我再次投递WSARecvFrom请求,也没问题.这时处于稳定状态6.但如果这时我用这个套接字进行WSASendTo投递数据,会发现完成端口关联的线程中GetQueuedCompletionStatus没有返回投递完成的消息.7.且6中WSASendTo会导致两种不同的情况,一是如果客户确实存在,可以正常发送,也可以正常接收.但如果客户端不存在,会导致GetQueuedCompletionStatus返回错误消息,为之前WSARecv投递的请求返回,且无法再进行投递了,结果就导致无法接收数据了.