免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4601 | 回复: 9
打印 上一主题 下一主题

[C] 请教:阻塞模式下返回EAGAIN的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-24 14:39 |只看该作者 |倒序浏览
程序结构如下:
    程序中每个线程和远程设备TCP连接,连接的socket采用为阻塞模式(超时通过setsockopt设为20秒)。
通讯过程如下:
    程序发送数据包给设备,等待(20秒)设备回应, 收到回应包后再发送下一条数据。
问题:程序运行一段时间后,有部分线程断开和设备的连接,错误输出为: errno=11, 即 EAGAIN.
         通过抓包看有如下过程:
                           程序-->[PSH,ACK]-->设备
                           程序<--[PSH,ACK]<--设备
                           程序-->[    ACK   ]-->设备
               上述通讯正常,持续一段时间后(几分钟)
                                        程序-->[PSH,ACK]-->设备
                           程序<--[PSH,ACK]<--设备
                            程序没有回应ACK包, 设备重传包, 20秒后,程序断开连接。

      从抓包看,传输层应该已经收到数据, 但应用程序却没有读到,导致20秒后超时,程序断开连接。

上述问题没想明白,也不知有什么好的解决方案,麻烦朋友们给些意见。

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2011-02-24 15:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-02-24 15:09 |只看该作者
线程开的不多, 有十几个。

论坛徽章:
0
4 [报告]
发表于 2011-02-24 15:11 |只看该作者
设备都是相同的, 只是有稍许性能差异而已

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
5 [报告]
发表于 2011-02-24 15:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-02-24 15:45 |只看该作者
谢谢 c/unix 的回答。

再问下: 对于非阻塞SOCKET,  很多时候会返回EAGAIN, 即意为着没读到数据,可继续读取;
         对于阻塞SOCKET, 返回EAGAIN 是否就意为着等待时间到呢?

论坛徽章:
0
7 [报告]
发表于 2011-02-24 16:20 |只看该作者
不是,一般EAGAIN是被信号中断了

论坛徽章:
0
8 [报告]
发表于 2011-02-24 17:20 |只看该作者
谢谢楼上朋友的回答。 如果EAGAIN是被信号中断了, 则可以忽略继续读取, 按照程序中socket是阻塞模式, 估计会僵死在 readn 上。

我觉得是否可以通过select( 添加20秒的超时 ) 去判断socket是否可读, 然后再readn ?

论坛徽章:
0
9 [报告]
发表于 2011-02-24 17:58 |只看该作者
EAGAIN          Resource temporarily unavailable (may be the same value
                       as EWOULDBLOCK) (POSIX.1)
SND_BUFFER没有可以写的空间了 应该是接收端处理数据有点慢
试着降低发送数据的速度

论坛徽章:
0
10 [报告]
发表于 2011-02-25 10:17 |只看该作者
谢谢楼上的回答。 现在发送速度也不是很快, 每秒钟20条左右的速度, 而且数据量比较小,不超过128字节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP