1.GetQueuedCompletionStatus()函数阻塞无返回。
问题描述:使用完成端口模型制作网络数据转发模块,TCP应用某有问题,使用Accept能正常侦听使用单独接收线程能完成客户端连接操作(此处不会用WSAAccept,有大神还请赐教)。使用WSARecv、WSASend进行投递能正常完成数据收发。后改为UDP通信,使用WSARecvFrom、WSASendTo进行投递,GetQueuedCompletionStatus总没有返回。
问题解决:网上查资料一直没有得到解决,都说该模型很成熟,应该相信微软的软件设计师来找自己的问题。接下来就是在各处添加异常处理。问题出来啦,在投递WSARecvFrom时返回值为Socket_Error,WSAGetLastError返回最近了次Socket错误码为10014。到此为止,问题原因应该已经出来啦。接下来解决10014问题。
2.WSARecvFrom、WSASendTo时10014异常
百度结果:10014 -WSAEFAULT:地址无效。传给Winsock函数指针地址无效。若指定的缓冲区太小,也会产生这个错误。
首先看WSARecvFrom比WSARecv区别
int WSARecvFrom( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct sockaddr FAR* lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
红色字体为WSARecvFrom多出部分。用来存放目标机Socket信息及结构体大小。问题解决:在投递WSARecvFrom前先申请参数lpFrom空间,类型为PSockAddr。lpFromlen=Sizeof(PSockAddr^);运行程序,投递结果仍为Socket_Error,这次参数值为997。WSA_IO_PENDING=997,错误代码WSA_IO_PENDING表明重叠操作已成功启动,完成将显示在稍后的时间。该操作为正常现象,屏蔽掉即可。