求助: linux服务器socket read或write 出现errno=5的错误

xiaowulai1225 2016-04-07 07:31:19
如题,c写的一个socket网关服务器和内网的一个逻辑服进行通讯。系统版本是centos6.5 x64
观察下来如果经常性的有客户端和网关交互(网关把客户端消息转给内网服务器,或是内网服通过网关发送消息给客户端),无论
消息量的大小,网关服和内网服的socket连接在read或是write时 经常性会出现 errno=5的错误,观察下来基本2~3天就会出现一次。请问下这个错误码表示什么意思?大概是什么原因引起的

因为观察到如果几天没有任何客户端消息的情况下网关基本不会出现这个错误的。
感觉上应该和代码逻辑有点关系。
在论坛里搜到个类似的问题,有人回答可能是因为网卡等设备引起的。

求教大神!万分感谢!
...全文
1792 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-08-14
  • 打赏
  • 举报
回复
引用 9 楼 xiaowulai1225 的回复:
谢谢大家。问题终于找到了。 原来的代码是这样的(send调用的情况类似): s32 len = recv( m_socket, data, len, 0 ); // printf("recv = %d\n", len); if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ) { break; } recv/send之后有一行printf,是为了调试而新增的。 进程退到后台执行后,程序调用printf会产生errno=5的错误。 而socket在调用recv返回EAGAIN错误后,因为又调用了printf导致errno被修改了, 导致后面的判断条件认为是socket收发数据异常而断开了连接 所以就出现了上面的情况。
谁让你不紧接在出错函数后获取errno的?活该!!
Doubleddd 2019-08-14
  • 打赏
  • 举报
回复
pengzhixi 2016-04-21
  • 打赏
  • 举报
回复
前面说过后台进程读写终端都会引起SIGTTOU或者SIGTTIN的信号这个是会终止进程的
xiaowulai1225 2016-04-21
  • 打赏
  • 举报
回复
谢谢大家。问题终于找到了。 原来的代码是这样的(send调用的情况类似): s32 len = recv( m_socket, data, len, 0 ); // printf("recv = %d\n", len); if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ) { break; } recv/send之后有一行printf,是为了调试而新增的。 进程退到后台执行后,程序调用printf会产生errno=5的错误。 而socket在调用recv返回EAGAIN错误后,因为又调用了printf导致errno被修改了, 导致后面的判断条件认为是socket收发数据异常而断开了连接 所以就出现了上面的情况。
xiaowulai1225 2016-04-14
  • 打赏
  • 举报
回复
谢谢两位回复,我在试试看。有其他进度或发现在贴出来
xiaowulai1225 2016-04-12
  • 打赏
  • 举报
回复
这是我最近测试下来的结果:实际测试在centos 5.8 6.5 和 unbutn 14.04上都会出现。 上面说的在 centos5.8 没有出现是因为那个版本在 send recv 后没有调用到printf。 测试版本因为要确认消息的收发,所以特意加上了log输出。 最终测试发现 只要在 send recv 后面加上printf ,并且程序这样启动 ./xxxx & ,那么必然会出现 errno=5的错误; 如果不加 printf,或是 printf改为写文件,或是 程序 nohup ./xxxx & 启动,那么就不会出现errno=5的错误; 哪个大神可以帮忙分析下原因吗?
赵4老师 2016-04-12
  • 打赏
  • 举报
回复
printf改为fprintf写文件吧。 可能是因为printf导致console上卷时耗时过长影响send和recv的速度。我猜。
pengzhixi 2016-04-12
  • 打赏
  • 举报
回复
后台进程写控制终端产生了SIGTTOU信号。你可以捕捉下看看是否是这样
xiaowulai1225 2016-04-08
  • 打赏
  • 举报
回复
谢谢!这个意思就是还是因为系统(无论是硬件还是软件)引起的了?
赵4老师 2016-04-08
  • 打赏
  • 举报
回复
流量限制 水晶头接触不良 机房有人碰了网线 传输内容中有禁词 被黑客攻击 电源不稳 散热有问题 ……
xiaowulai1225 2016-04-08
  • 打赏
  • 举报
回复
感谢回复!那是说是硬件或是驱动问题引起的? 因为我同样的版本(代码一样)在 centos 5.8 32位系统上重编运行就没有这种错误。 昨天晚上在有问题的机器上做了下echo的测试,客户端每条发200+字节数据,服务器收到后回包。 上了400个连接,基本几分钟就出现一次,感觉像是这个socket到达了某个流量阈值后被断开。 用来测试的两个机器都是阿里云的服务器,只是所属的位置和版本不一样。
小灸舞 版主 2016-04-07
  • 打赏
  • 举报
回复
errno5 : Input/output error
errno=5的错误是EIO,表示IO错误
EIO比较棘手,你可能需要查看当时更多的信息。
网卡设备异常,驱动异常啊,硬件出错都可能导致这个问题。

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧