求助帖, 非阻塞send, 却出现EINPROGRESS错误, 持续在线等!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

BT_Dana 2013-09-02 10:26:33
场景描述(利用epoll管理):
客户端发送请求, 服务端回应(连续回应n个包结束). 第一次没问题
客户端再次发送请求, 服务端继续回应(连续回应n个包结束), 但是这次send完最后一个包之后, epoll取socket的循环, 仍然会把这个socket取出, 并且flag是错误, 错误为EINPROGRESS.

大家遇到过吗, socket是非阻塞的send. 每次都是第一次没问题, 第二次就这样.
不明白为什么非阻塞send也会出现EINPROGRESS, 又不是connect.
...全文
1111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BT_Dana 2013-09-11
  • 打赏
  • 举报
回复
最后定位到了问题, 是在断开阶段. 通过getsockopt能得到socket的正常错误, 显示断开了. 至于全局的error是EINPROGRESS的问题, 感觉应该是之前connect阶段被赋值了就再没改过. 谢谢大家, 结贴了~
qiyu1988 2013-09-03
  • 打赏
  • 举报
回复
引用 8 楼 aa2650 的回复:
引用 7 楼 qiyu1988 的回复:
把connect改成阻塞的,再测试下结果
我这边是作为server呀, 被连接
如果错误信息定位不到问题,写个测试客户端程序调试下
BT_Dana 2013-09-03
  • 打赏
  • 举报
回复
引用 7 楼 qiyu1988 的回复:
把connect改成阻塞的,再测试下结果
我这边是作为server呀, 被连接
qiyu1988 2013-09-03
  • 打赏
  • 举报
回复
把connect改成阻塞的,再测试下结果
BT_Dana 2013-09-03
  • 打赏
  • 举报
回复
引用 5 楼 qiyu1988 的回复:
man send,手册ERRORS里面没有EINPROGRESS的值,应该不是send的报错
是呀 我也man过了, 确实没有. 但是send几次之后, 为什么socket状态会变成出现这个错误值呢, send是分阻塞的, 网络也正常
qiyu1988 2013-09-03
  • 打赏
  • 举报
回复
man send,手册ERRORS里面没有EINPROGRESS的值,应该不是send的报错
BT_Dana 2013-09-03
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
这个错误应该很正常吧!连接没有完成吧! 看看是不是socket已经失效啦!也就是链路被破坏了 是不是在重连过程中,你这边又在继续发数据呢? 每次调用接口的时候最好能及时的检查返回值!
首先服务端肯定不会主动断开的, 客户端那边也没有断开的逻辑. 已经连接ok, 网络也正常. o(︶︿︶)o 唉, 奇怪
BT_Dana 2013-09-03
  • 打赏
  • 举报
回复
引用 1 楼 lufeipeng 的回复:
你的错误码应该是调用send之前设置的, 看下是不是socket对应的客户端已经关闭导致的
能够确定客户端没有关闭, 客户端只是发请求, 然后循环receive结果, 直到接受完毕. 第二次我服务器这边显示发完了n=8个包, 客户端那边只显示接受到了两三个包, 就停住了. 错误码应该不是在send之前设置的, 是发完了所有n个包之后发生的, 因为epoll取到socket之后我都是先判断是否有错误, 才判断读写的. 所以应该确实是所有包write完之后才有error的.
max_min_ 2013-09-03
  • 打赏
  • 举报
回复
这个错误应该很正常吧!连接没有完成吧! 看看是不是socket已经失效啦!也就是链路被破坏了 是不是在重连过程中,你这边又在继续发数据呢? 每次调用接口的时候最好能及时的检查返回值!
卢飞鹏 2013-09-02
  • 打赏
  • 举报
回复
你的错误码应该是调用send之前设置的, 看下是不是socket对应的客户端已经关闭导致的

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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