C#Tcp服务端主动断开,客户端无法感知问题

本文探讨了一对一和一对多TCP连接中,服务端主动断开连接后客户端的重连问题。在一对多情况下,部分客户端无法通过异常捕获进行重连。尝试多种方法无效后,采用自定义双向心跳方案解决。质疑TCP协议为何不提供简单重连机制。

服务端使用tcplistener接收连接请求。客户端使用tcpclient.connect主动连接。

在一对一的情况下(1个服务端只连接1个客户端时),服务端调用client.Close()主动关闭连接后,客户端接收函数(revString = br.ReadString();)立马报异常,因此可通过捕获此异常来进行重连操作。

但是,当一对多的情况下(1个服务端同时连接多个客户端),服务端对所有的client调用client.Close()主动关闭连接后,经常有少数(一般是一个)客户端无法捕获上面的异常,因此就无法通过捕获异常来重连。

为了解决上述问题,我试了网上很多方法,都不能解决此问题:

1、客户端验证tcpclient.Connected,发现始终为true。失败。

2、客户端验证tcpclient.Client.Connected,发现始终为true。失败。

3、客户端验证tcpclient.Client.Poll(0, SelectMode.SelectWrite),发现始终为true。失败。

4、客户端验证tcpclient.Client.Poll(0, SelectMode.SelectError),发现始终为false。失败。

5、客户端验证tcpclient.Client.Poll(0, SelectMode.SelectRead),发现始终为false。失败。

6、客户端验证tcpclient.Available,发现始终为true。失败。

7、客户端使用tcpclient.Client.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null)。失败。

8、客户端使用tcpclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true)。失败。

最后没办法了,只好自己写了个双向心跳。成功。
但是我想不通tcp为什么被搞得这么复杂,一个简单的重连机制都不提供吗?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值