关于完成端口第一次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)类型的,添加了之后,也正常了。唉,辛苦啊,搜索了网上不少的资料,却没有发现什么直接点的答案。但现在总算可以松口气了。真的是要实践中才会发现问题!!