服务端使用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为什么被搞得这么复杂,一个简单的重连机制都不提供吗?