类库大魔王
类库大魔王 多年C++、Go项目经验,长期从事跨平台(Windows/macOS/iOS/Android)应用架构设计与开发。

关于完成端口第一次WSARecv投递失败


最后的最后,我终于发现了关于完成端口第一次WSARecv 投递失败的原因!

MSDN中关于WSARecv的原型如下:

1
2
3
4
5
6
7
int WSARecv(  
SOCKET s,  
LPWSABUF lpBuffers,  
DWORD dwBufferCount,  
LPDWORD lpNumberOfBytesRecvd,  
LPDWORD lpFlags,  
LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED\_COMPLETION\_ROUTINE lpCompletionRoutine );

其中,SOCKET 有了,Buffer 也有了,Overlapped 结构也有了,最后的可以设为NULL,只有NumberOfBytesRecved 和Flags 是要再另外声明传递进去的。但是,这里有一个容易漏掉的地方,就是第5个参数Flags的指针,在传递进去之前,一定要初始化Flags的值为 0。我到最后看到CSDN上一篇帖子上的代码,我的和那个几乎一样,但那个能正常收到数据,我的却总是10045 错误,一条一条地查对比较代码,发现唯一有影响的地方,就是那个多了一条Flags=0,而我的没有,马上翻到MSDN上的说明,一看,是个(In,Out)类型的,添加了之后,也正常了。唉,辛苦啊,搜索了网上不少的资料,却没有发现什么直接点的答案。但现在总算可以松口气了。真的是要实践中才会发现问题!!

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
如果你看不到评论框,说明Disqus被墙了。