您的位置:首页 > 其它

需要这样一个记事本-11 完成端口IOCP应用问题记录

2015-02-09 17:30 330 查看
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表明重叠操作已成功启动,完成将显示在稍后的时间。该操作为正常现象,屏蔽掉即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐