linux 开发 socket 假连接的问题

teachin88 2015-11-10 09:29:13
本来 服务器 -- 客户端 通过 socket 连接 正常。

然后, 服务器 重启了一下。 客户端 和 服务器 有心跳检测,检测到失联,客户端 会 重新 close socket -- create socket -- connect

但有时候会发生这样的情况(但并不是每次都这样):

客户端 connect 返回 成功 , 然后 实际发送数据 会失败。 然后 心跳检测到 失联, 又 connect, 但实际发送又失败。。。

也就是 connect 表面上能连接上,但实际上并没有 正常 地 连接。


请大侠们说说这是为什么。谢谢!

...全文
422 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
泽坤 2015-12-04
  • 打赏
  • 举报
回复
是这样的,刚开始连接正常; 重启服务器的时候发生了如下事件: 1.服务端程序关闭 2.系统在服务端程序关闭的时候,关闭了此Socket连接的文件描述符fd; 3.在关闭文件描述符fd的时候,服务器会向客户端发送一个FIN; 4.客户端接收到FIN之后,会返回ACK,但是这时客户端只知道是服务端关闭了Socket连接的写入部分,并不知道服务器的程序挂掉了。所以仍然会向服务端发送正常的数据; 5.这时候你重启了服务器,又重连成功,可能client端并没有刷新Socket连接,在内核中的记录仍然是服务器关闭了Soket的写入部分;在服务端由于你的重连,服务端看见的Socket就是可读可写的Socket;所以服务端能收到客户端发送的消息,但是客户端确不会接收服务端发送的数据; 从另一个角度看客户端在接收FIN之后,客户端的TCP在内核的状态已经是CLOSE_WAIT了,应该就不会再接收数据了。 以上是我的猜测,没有看到你程序执行的具体过程;不过你可以使用netstat -ntp 在客户端和服务器各个操作阶段。查看你的TCP的状态,应该就可以看的出来。
nswcfd 2015-12-04
  • 打赏
  • 举报
回复
1. “检测到失联”的逻辑是什么?几秒内没有read or write?还是select返回exception? 2. 重连是指什么?重新发起connect调用?新的socket还是老的socket?
nswcfd 2015-12-04
  • 打赏
  • 举报
回复
3. tcp or udp?
fxbszj 2015-11-27
  • 打赏
  • 举报
回复
On success, these calls return the number of characters sent. On error, -1 is returned, and errno is set appropriately. 客户端没有收到数据,怎么可能返回值正常
teachin88 2015-11-26
  • 打赏
  • 举报
回复
引用 2 楼 csdn_vieri 的回复:
发送失败,错误码是什么,先检查一下。
我可能没有说清楚,具体是这样: 1: 刚开始 服务器 --- 客户端 正常连接; 2: 服务器 重启。 客户端检测到 失联,socket 重连, 重连 成功。 3: 客户端 send 数据 给 服务器, send 返回值正常。 服务器也能正常接收数据。 4: 服务器 send 数据给 客户端, send 返回值正常。 客户端 并没有收到数据。 5: 此时客户端 重启后, socket 连接上 服务器, 就一切正常。 但 以上描述的 假连接现象 不是 每次 服务器 重启后都会发生。很多时候 重连 也是能正常收发数据的。
csdn_vieri 2015-11-12
  • 打赏
  • 举报
回复
发送失败,错误码是什么,先检查一下。
teachin88 2015-11-11
  • 打赏
  • 举报
回复
自己顶一下!

23,118

社区成员

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

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