最近在做一个tcp服务器,服务断用 var socket = Socket.Accept() 监听请求,但在客户端断开后无法重连。
1.var socket = Socket.Accept() 产生一个新的socket接收数据正常
2.当前 socket 客户端因某些原因断开连接后,无法再次连接到服务器,通过抓包,客户端是有发送连接请求的,但都被服务端重置了。
示例:
条件1:服务端在死循环内使用 var socket = await _server.AcceptAsync(); 接收请求,不考虑断开和重启(也没有断开过)。
条件2:假如有一个ip为192.168.1.2的客户端请求并正常连接到服务端(socketid == 2),然后因为某些原因断开连接。
条件3:因为服务端有下发心跳包,在检测到客户端断开后已经将 socketid == 2 的 socket 销毁并设置为null
条件4:问题,ip为192.168.1.2的客户端再次请求连接服务端无法连接。
client要用新的socket来连接到server, 而不是之前已经出问题的socket实例.
打个比方, 服务端重启导致socket断开了, 但是client还用老的socket连接来发数据,
但是新起来的server都没有老的socket的相关信息(没有握手,没有对方端口号,没有seqno), 你说这个数据怎么接收....
这个我知道,想知道怎么创建新的socket,直接用原ip和端口new一个吗?新socket不是由 Socket.Accept() 统一创建的吗?
问题是客户端断开后,我也把原来的socket销毁了,但 Socket.Accept() 根本不再产生新的 socket
@Adming: 在client侧 new 一个新的socket 然后connect到server呀. 这个时候sever的accept就能接到client新的的连接了.
@czd890: 无法控制客户端,客户端是标准的设备,生产环境在用的,算得上是久经考验的,所有还是得从服务端想办法。
@Adming: 如果情况如你说是socket异常断开后,
在client不重新建立新连接, 而继续用老的连接继续发送数据这种case. 神来了都没办法, 这是tcp协议决定了的事情.
@czd890: 是的,但我想不通的是,为什么服务器如果重启一下,客户端还是可以连接的。
@Adming: 那问题估计没有找到点上. 可能性: 主动关闭server, server和client可能会经过完整的4个挥手过程, client能处理这种情况, 异常情况下client没有收到FIN或者处理的有问题...所以就不对路子了.
随便猜测哈, 需要更多调查, 最好是抓包看一下. 异常情况下client的tcp包是啥样的.