请教大家两个关于WSARecv的问题?
1.服务器程序在accpet上来一个客户端连接之后,一般都是不停的接受客户端发送过来的数据,再把处理后的结果发送回去,然后继续接受数据。在IOCP中,也就是用WSARecv函数投递信息,然后调用GetQueuedCompletionStatus查看投递的接受操作的结果,如果接受无误,则处理数据,发送结果,然后再次投递一个WSARecv。
问题是,WSARecv好像是可以立刻返回的吧,也就是说调用WSARecv的时候,如果TCP接受缓冲区内就有数据,这时WSARecv立刻就返回了,而且返回值是0,并且通过参数lpNumberOfBytesRecvd可以知道接受到了多少字节的数据。
这样的话,如果要实现循环接收数据,岂不是要对每一个WSARecv操作都在外面加一个while(true),而且还要在后面加上如果返回0就立刻处理接受数据的逻辑???
我本以为只要投递一个WSARecv之后,在工作线程中处理接收的结果就可以了,现在不知道如果调用成功并立刻返回应该怎么处理了...
2.刚才在网上看到这么一段话,是用来处理WSANOBUF这个错误的:"投递WSARecv的时候,可以采用一个巧妙的设计,先投递0大小Buf的WSARecv,如果返回,表示有数据可以接收,我们开启真正的recv将数据从TCP/IP层缓冲区取出来,直到WSA_IO_PENGDING."
这句话的意思,是不是,调用WSARecv的时候,把lpBuffers中的每一个WSABuff的len都设置为0。然后GetQueuedCompletionStatus返回的时候,一直recv数据,直到recv返回-1,而且WSAGetLastError()是WSA_IO_PENDING???
还有,如果一个套接字创建的时候,就指定了overlapped属性,是不是就已经是非阻塞套接字了,不会卡在recv那里???
初学IOCP,谢谢大家!!!