请教WSARecv & Recv 的区别

游牧小小诗人 2011-05-30 12:15:00
WSARecv & Recv
一直没搞懂这俩区别(非阻塞 & 阻塞)
Recv 是在比如说,客户端发来1024K数据,,,服务端以10K/S (不要纠结这速度) 接收,然后Recv要在接收完这1024K数据后才返回么?

WSARecv 同样速度,是马上就返回了~~~~


还有,帮忙以通俗点的语句解释一下,WSARecv 的各参数~~~MSDN的好拗口,,,搞得我不知道怎么回事了~~~
...全文
1935 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
九面螳螂 2013-09-23
  • 打赏
  • 举报
回复
我也纠结这个问题呢,看来还是需要认真学习啊!
vcf_reader 2011-05-31
  • 打赏
  • 举报
回复
对于应用来说,发送的时候,采用非阻塞,不用等发完就可以返回了。当然用阻塞也可以,但当数据量很大的时候,程序有假死现象。

接收的时候,用阻塞比较简单。注意为了防止程序假死现象,在另一个线程里面读。
vcf_reader 2011-05-31
  • 打赏
  • 举报
回复
非阻塞:不等执行完就返回

阻塞:一直等到执行完才返回
wjb_yd 2011-05-31
  • 打赏
  • 举报
回复
recv操作默认是阻塞的,没有数据到来,所在的线程会一直被挂机。
而WSARecv是非阻塞的,只是向iocp队列投递了一个recv操作就立刻返回了,线程继续向下执行。
而你要做的是不停的从iocp完成队列获取已经完成的操作,并处理获得的数据。这个投递操作的线程是并行的。
游牧小小诗人 2011-05-30
  • 打赏
  • 举报
回复
自己坐沙发~~~~~~~~吃完饭回来看~~~~~~~~~~~
Eleven 2011-05-30
  • 打赏
  • 举报
回复
recv()定义在winsock.h,WSARecv定义在winsock2.h文件中。
recv和WSARecv:
对在已连接套接字上接受接入数据来说,recv函数是最基本的方式。它的定义如下:
int recv (
SOCKET s,
char FAR* buf,
int len,
int flags);
第一个参数s,是准备接收数据的那个套接字。第二个参数buf,是即将收到数据的字符缓冲,而len则是准备接收的字节数或buf缓冲的长度。最后,flags参数可以是下面的值:0、MSG_PEEK或MSG_OOB。另外,还可对这些标志中的每一个进行按位和运算。当然, 0表示无特殊行为。MSG_PEEK会使有用的数据复制到所提供的接收端缓冲内,但是没有从系统缓冲中将它删除。另外,还返回了待发字节数。

WSARecv函数在recv的基础上增加了一些新特性。比如说重叠I/O和部分数据报通知。定义如下:
int WSARecv (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE);
参数s,是已建立连接的套接字。第二和第三个参数是接收数据的缓冲。lpBuffers参数是一个WSABUF结构组成的数组,而dwBufferCount则表明前一个数组中WSABUF结构的数目。如果接收操作立即完成,lpNumberOfBytesReceived参数就会指向执行这个函数调用所收到的字节数。lpFlags参数可以是下面任何一个值:MSG_PEEK、MSG_OOB、MSG_PARTIAL或者对这些值进行按位和运算之后的结果。
游牧小小诗人 2011-05-30
  • 打赏
  • 举报
回复
不是没人答吧~~再顶下~~~~~100%结贴率啊

18,356

社区成员

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

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