免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7278 | 回复: 12

[函数] 请教大家一个关于 socket read的问题。 [复制链接]

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 15:04 |显示全部楼层
先把客户端接收的函数写出来把。

while(rbyte < datalen)
{
     int n = 0;
      if ((n = read(socket, buf + rbyte, datalen - rbyte)) > 0)
     {
         rbyte += n;
         printf("receive %d.\n", n);
      }
    else if (n == 0)
   {
        return rbyte;
   }
   else return error;
}

大概是这样。

服务器发了 105个字节给客户端。客户端第一次就立即读出105字节,然后还进行第二次读,这次阻塞在 read里面了。我的疑问是:
1、既然客户端在第一次读的时候已经把105个字节全部读出来了,为什么第二次读 不立马返回 n = 0?
2、对于read函数,如果服务器发了105个字节,客户端 要做两次读操作才能把这105个字节读出来?第一次读出105个内容,第二次去判断还有没有内容要读,如果没有立即返回?

谢谢。

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 15:12 |显示全部楼层
现在的现象是:立马读出105字节,但是会阻塞在第二次调用read 要等20秒才返回,返回大小也是105字节。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-14 15:12 |显示全部楼层
设置成非阻塞

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 15:15 |显示全部楼层
cokeboL 发表于 2012-09-14 15:12
设置成非阻塞



这个方法应该可以解决,但是我不明白的是。为什么明明已经把105个字节的内容都读出来了(我申请读的字节数大于105),第二次读的时候没有立即返回?

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 15:15 |显示全部楼层
为什么要等20来秒才返回?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-14 15:57 |显示全部楼层
回复 4# sublx


    阻塞就是一直等,直到有数据来了才返回,返回了你继续循环等。

    非阻塞就是不管有没有数据,立刻返回。

    你得先把阻塞、非阻塞是啥意思弄明白

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-14 15:58 |显示全部楼层
sublx 发表于 2012-09-14 15:15
为什么要等20来秒才返回?


这个20秒哪里来的?断开连接了?

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 16:09 |显示全部楼层
cokeboL 发表于 2012-09-14 15:58
这个20秒哪里来的?断开连接了?



我大概知道怎么回事了。
1、服务端发了105个字节。
2、我去接收,但是recv_len 大于105字节(比如512)。那么客户端在接收了105字节后,发现小于512,又去read,而这个时候接收缓冲里面已经没有数据可读了,然后客户端阻塞。
3、20秒返回 应该是服务端设置了超时 20秒后 把这个socket关掉了。

谢谢指导!

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2012-09-14 16:19 |显示全部楼层
回复 8# sublx


    第二条不对,read的时候只要缓冲区有东西就读,不超过buf能读多少读多少然后返回。你那个阻塞是while的第二次循环

    阻塞的。20秒这个断开连接跟我猜的一样。哎,想玩网络,先把UNIX环境高级编程看懂了解unix基础然后再把UNIX网

    络编程 卷1 和TCP/IP详解 卷1搞精了才行。加油~

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
发表于 2012-09-14 21:24 |显示全部楼层
第二条不对吗?这个socket是非阻塞的,read我传进来的要读的长度512字节,服务器发的是105字节。那么我第一次读到105后,发现少于512,所以继续第二次读,由于是非阻塞的,所以阻塞在read那里(这时候服务器不发数据),服务器设置了超时(20秒左右),超时后close掉这个链接,这个时候read应该直接返回-1。应该是这样吧。你说的那几本书我都看过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP