
在网上查了一下,关于recv()的解释大致是这样的:
int recv( SOCKET s, char FAR *buf, int len, int flags );
不论是客户端还是服务器端应用程序都用recv函数从TCP连接的另一端接收数据。
该函数的:
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。
这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
但是这里只提到了接受缓冲区的数据大于buf的长度的情况,那如果接受缓冲区的数据比buf的长度短会怎样?是直接返回还是一直等待直到buf被填满?
番茄星人 发表于 2015-10-9 18:03不会的,少于的话就少于,填不满,但是返放回来,而且返回值就是接收到的数据字节数 ...
假如socket返回 “hello\0”
那么
int revnum = recv( s, buf,1024, 0);
//那么 revnum = 6
[查看全文]