免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: simonsoft
打印 上一主题 下一主题

[函数] recv 阻塞问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-11 16:58 |只看该作者
原帖由 simonsoft 于 2008-8-11 16:36 发表

什么情况才会阻塞到100字节后才返回?


自己阻塞:数数,不够 100 继续读,小心别覆盖了原来的.........

论坛徽章:
0
12 [报告]
发表于 2008-08-11 16:59 |只看该作者
LOWATER

论坛徽章:
0
13 [报告]
发表于 2008-08-11 17:01 |只看该作者
原帖由 converse 于 2008-8-11 16:33 发表
1.确认你send出去100个字节的数据
2.recv的参数写100只是最多接收100字节的数据, 而不是正好接收100字节的数据.


我recv的是服务器传给我的331 Password required for username 没100字节
recv参数100是指最多100字节 这我知道,问题是recv阻塞模式下要等到接受缓存中有足够数据满足这个读请求时才返回。

所以我不懂为什么recv会没接受满100字节就返回了

论坛徽章:
0
14 [报告]
发表于 2008-08-11 17:08 |只看该作者
原帖由 simonsoft 于 2008-8-11 17:01 发表


我recv的是服务器传给我的331 Password required for username 没100字节
recv参数100是指最多100字节 这我知道,问题是recv阻塞模式下要等到接受缓存中有足够数据满足这个读请求时才返回

所以我不懂 ...

谁告诉你的?
如果对方只传10字节,那不是你的调用就挂在那了?

论坛徽章:
0
15 [报告]
发表于 2008-08-11 17:10 |只看该作者

回复 #13 simonsoft 的帖子

无语,麻烦你man 2 recv看看.

论坛徽章:
0
16 [报告]
发表于 2014-07-10 14:36 |只看该作者
具体没太搞清楚,但是用如下的方式可以达到阻塞的效果。
FILE *in = fdopen(socket, "r+");
int ReadCnt = fread(buff, 1, 100, in);
这样就会阻塞到100个才返回。

论坛徽章:
0
17 [报告]
发表于 2014-07-10 15:00 |只看该作者
ls挖坟啊~~08年帖子~~

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
18 [报告]
发表于 2014-07-10 15:54 |只看该作者
回复 1# simonsoft

谁告诉你recv(100)就一定会阻塞读满100个字节才返回的?

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
19 [报告]
发表于 2014-07-11 09:29 |只看该作者
既然有人挖坟了。我也说说我的理解。不对请指正
recv只是负责去socket的内核BUFFER里COPY数据。
recv传入给内核的len数值只是告诉内核,用户程序开辟了多大的空间来COPY数据(可以理解为MAX)

调用阻塞recv时:
(1)如果内核BUFFER没有数据,那么recv真正阻塞
(2)如果内核有数据,则有多少就COPY多少,直到大小等于len
    也就是说,recv返回的值只表明从SOCEKT缓存中COPY了多少。如果缓存中本身就没有len个数据,那肯定也不能硬返回len个吧

我觉得所谓有阻塞,体现在情况(1),而不是LZ所说的一定要收到len大小才返回
LZ到时可以通过阻塞recv自己实现一个 recvn的函数(就像writen一样),只有收到len才返回,否则一直在循环。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP