天翼套接字服务器已经运行,套接字客户端关闭连接,服务器不知道吗?

套接字客户端会关闭连接,服务器不知道吗?

我在C#中的事件BeginReceive()上收到几个错误.

如何检查客户端是否还活着,以及在程序的哪个位置放置此检查更好?

解决方法:

使用套接字编程时,有几种“封闭连接”. (我将使用BSD派生的系统调用名称进行套接字操作,希望它们通过对C#的更改保持相似的名称.)

>客户端程序使用shutdown()或close()关闭套接字.发生这种情况时,TCP会将FIN数据包发送到您的服务器.当您尝试读取超过客户端发送的数据的最后一个字节时,它将在服务器中显示为封闭的套接字.下一个read()可能会引发异常或错误情况. (因环境而异.)此条件通常适用于轮询样式的接口(例如select(2)或poll(2)),因此您的标准事件循环处理程序可以发现客户端退出并对其进行处理.

>客户端程序可能会意外退出.在这种情况下,客户端的TCP实现可能会发送FIN数据包,但可能不在应用程序输入解析器的“预期”位置.准备处理指示应用程序过早终止的零字节读取或EOF读取.

>客户端主机可能会意外死亡.在这种情况下,客户端的TCP实现将无法将FIN数据包发送到您的服务器,并且您将完全不会收到客户端连接已终止的任何通知.您可以启用TCP SO_KEEPALIVE套接字选项,但是在发送Keepalive探测之前,至少Linux默认将系统范围的时间设为不活动两个小时.

如果系统“快速”恢复,如果将stateful firewall配置为DROP数据包不匹配允许或发起的流量,则您的应用程序将以响应或静默方式接收TCP RST数据包.可以检测到RST情况,类似于FIN数据包.丢弃的数据包的静默只能使用应用程序级别的keepalive数据包方案来检测.

因此,最好在您可以接受的时间范围内构建某种应用程序级别的keepalive ping数据包. (例如,IRC使用PING和PONG数据包来确保客户端仍连接到服务器-两次检查之间的时间可由网络管理员配置.)

两次ping之间的间隔以及要接受多少个失败的ping数据包在很大程度上取决于您的应用程序-您可能愿意等待二十分钟,然后再注意到并删除断开连接的客户端,或者您可能希望注意到并删除一个仅在二十秒后断开客户端连接.多长时间取决于工作环境(对于火星漫游者来说20秒不起作用,但是对于连接LAN的第一人称射击游戏来说可能是十倍长)和可用于“管理开销”的网络带宽.

标签:sockets,networking,network-programming,c

来源: https://codeday.me/bug/20191102/1988882.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值