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

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表明重叠操作已成功启动,完成将显示在稍后的时间。该操作为正常现象,屏蔽掉即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值