在socket 编程中,假如一个客户端自己主动关闭了连接,那么服务器端是怎么知道关闭连接了的呢?

lzjnhs 2011-10-15 03:59:15
在socket 编程中,假如一个客户端自己主动关闭了连接,那么服务器端是怎么知道关闭连接了的呢?.
...全文
467 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamzme 2011-10-15
  • 打赏
  • 举报
回复
一般如果如果服务器段的线程或者进程阻塞在read(IO复用也会返回EOF)的话,发起释放连接的一端会发送一个FIN包,这时候read不会被阻塞,会返回EOF,此时服务端应该做error处理。
同是系统网络编程初学,有不对地方大家一起探讨。
super_admi 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ronald_z 的回复:]

网络断开后,会收到OnClose事件,但对于无线网络的掉线情况,一般收不到这个事件通知,需要自己定义一个定时器来扫描客户端是否还保持连接
[/Quote]

还是自定义心跳比较保险。
qq120848369 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]

TCP的话,本端close,对端会recv到0字节。 对端非正常断开需要做心跳。
UDP的话,做心跳或者指定一个正规的关闭流程。

这些套接字在你send/sendto的时候,如果对端有问题,是会返回错误的,返回值-1,errno被设置,一般errno有以下几种,它们都是ICMP差错报文提供的支持,给你粘几个:

ECONNRESET //著名的RST
……
[/Quote]

另外,你用I/O复用接口,select/poll/epoll的时候,指定SO_ERROR事件,那么这些对端强制关闭引发的错误也许会被当做ERROR返回,于是你可以关闭这些ERROR的SOCKET,也是一个了解对端情况的办法。
qq120848369 2011-10-15
  • 打赏
  • 举报
回复
TCP的话,本端close,对端会recv到0字节。 对端非正常断开需要做心跳。
UDP的话,做心跳或者指定一个正规的关闭流程。

这些套接字在你send/sendto的时候,如果对端有问题,是会返回错误的,返回值-1,errno被设置,一般errno有以下几种,它们都是ICMP差错报文提供的支持,给你粘几个:

ECONNRESET //著名的RST
A connection was forcibly closed by a peer.


EDESTADDRREQ
The socket is not connection-mode and does not have its peer address set, and no destination address was specified.

EHOSTUNREACH
The destination host cannot be reached (probably because the host is down or a remote router cannot reach it).
ENETUNREACH
No route to the network is present.
Ronald_Z 2011-10-15
  • 打赏
  • 举报
回复
网络断开后,会收到OnClose事件,但对于无线网络的掉线情况,一般收不到这个事件通知,需要自己定义一个定时器来扫描客户端是否还保持连接
PG 2011-10-15
  • 打赏
  • 举报
回复
看书吧
ayw215 2011-10-15
  • 打赏
  • 举报
回复
socket写的时候处理下异常就可以了

69,369

社区成员

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

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