搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 209|回复: 3
收起左侧

关于recv()函数的疑问

[复制链接]

该用户从未签到

6

主题

8

好友

2018

积分

Continue

积分
2018
发表于 2015-10-8 19:28:48 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
在网上查了一下,关于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被填满?


签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

45

主题

29

好友

5万

积分

第三章

番茄易推倒

积分
52288

技术宅四周年庆组委会纪念

发表于 2015-10-9 18:03:56 | 显示全部楼层
不会的,少于的话就少于,填不满,但是返放回来,而且返回值就是接收到的数据字节数
今を大切にして,ヤンデレしています
回复 支持 反对

使用道具 举报

该用户从未签到

45

主题

29

好友

5万

积分

第三章

番茄易推倒

积分
52288

技术宅四周年庆组委会纪念

发表于 2015-10-9 18:06:31 | 显示全部楼层
番茄星人 发表于 2015-10-9 18:03
不会的,少于的话就少于,填不满,但是返放回来,而且返回值就是接收到的数据字节数 ...

假如socket返回   “hello\0”
那么
int  revnum = recv( s, buf,1024, 0);
//那么 revnum = 6
今を大切にして,ヤンデレしています
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

8

好友

2018

积分

Continue

积分
2018
 楼主| 发表于 2015-10-10 18:37:57 | 显示全部楼层
番茄星人 发表于 2015-10-9 18:06
假如socket返回   “hello\0”
那么
int  revnum = recv( s, buf,1024, 0);

谢谢了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-6-16 20:33 , Processed in 0.086978 second(s), 18 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表