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

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

大家遇到过吗, socket是非阻塞的send. 每次都是第一次没问题, 第二次就这样.
不明白为什么非阻塞send也会出现EINPROGRESS, 又不是connect.
...全文
1157 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,217

社区成员

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

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