请教大家两个关于WSARecv的问题?

wjb_yd 2011-03-29 02:13:39
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,谢谢大家!!!
...全文
203 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb_yd 2011-04-01
  • 打赏
  • 举报
回复
6楼求解释~
wjb_yd 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jwybobo2007 的回复:]
1.反复投递,第一次投递返回0以及,完成队列被触发,GetQueuedCompletionStatus返回,此时接收数据,接收完以后再投递下一次,如此反复即可

2.可以投递0字节,当GetQueuedCompletionStatus返回时表示有数据到来,此时用循环的recv把所有数据都接收完,直到WSA_IO_PENDING错误

3.是的,不需要额外设置就已经是非阻塞了
[/Quote]
你好,我现在遇到两个问题。第一,如果投递WSARecv时,缓冲区的长度设置为0,会导致GetQueuedCompletionStatus参数返回的dwBytes也变成0了,这样我无法判断出套接字正常关闭的情况了。
第二,好像必须要ioctlsocket(lpConnInfo->sSocketToRecv, FIONBIO, &iMode);一下,把套接字设置成非阻塞才行,而且接受完毕信息后,WSAGetLastError()得到的是WSAEWOULDBLOCK
,而不是WSA_IO_PENDING
jwybobo2007 2011-03-29
  • 打赏
  • 举报
回复
1.反复投递,第一次投递返回0以及,完成队列被触发,GetQueuedCompletionStatus返回,此时接收数据,接收完以后再投递下一次,如此反复即可

2.可以投递0字节,当GetQueuedCompletionStatus返回时表示有数据到来,此时用循环的recv把所有数据都接收完,直到WSA_IO_PENDING错误

3.是的,不需要额外设置就已经是非阻塞了
哈利路亚1874 2011-03-29
  • 打赏
  • 举报
回复
IOCP就是先投递WSARecv,接收到数据后,在该套接字上再继续投递WSARecv,这样,一环扣一环,就不断的实现数据的接收了
wjb_yd 2011-03-29
  • 打赏
  • 举报
回复
第一个问题哪位朋友可以帮忙解答一下嘛?
Eleven 2011-03-29
  • 打赏
  • 举报
回复
还有,如果一个套接字创建的时候,就指定了overlapped属性,是不是就已经是非阻塞套接字了,不会卡在recv那里???
----

需要调用
u_long iMode = 1;
ioctlsocket(m_socket, FIONBIO, &iMode);

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧