首页 新闻 会员 周边

Socket.Accept() 断线后无法重连?

0
悬赏园豆:10 [已解决问题] 解决于 2021-06-22 09:46

最近在做一个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的客户端再次请求连接服务端无法连接。

Adming的主页 Adming | 初学一级 | 园豆:119
提问于:2021-03-10 13:49
< >
分享
最佳答案
0

client要用新的socket来连接到server, 而不是之前已经出问题的socket实例.

打个比方, 服务端重启导致socket断开了, 但是client还用老的socket连接来发数据,
但是新起来的server都没有老的socket的相关信息(没有握手,没有对方端口号,没有seqno), 你说这个数据怎么接收....

收获园豆:10
czd890 | 专家六级 |园豆:14412 | 2021-03-10 14:09

这个我知道,想知道怎么创建新的socket,直接用原ip和端口new一个吗?新socket不是由 Socket.Accept() 统一创建的吗?
问题是客户端断开后,我也把原来的socket销毁了,但 Socket.Accept() 根本不再产生新的 socket

Adming | 园豆:119 (初学一级) | 2021-03-10 14:15

@Adming: 在client侧 new 一个新的socket 然后connect到server呀. 这个时候sever的accept就能接到client新的的连接了.

czd890 | 园豆:14412 (专家六级) | 2021-03-10 15:08

@czd890: 无法控制客户端,客户端是标准的设备,生产环境在用的,算得上是久经考验的,所有还是得从服务端想办法。

Adming | 园豆:119 (初学一级) | 2021-03-10 15:16

@Adming: 如果情况如你说是socket异常断开后,
在client不重新建立新连接, 而继续用老的连接继续发送数据这种case. 神来了都没办法, 这是tcp协议决定了的事情.

czd890 | 园豆:14412 (专家六级) | 2021-03-10 15:52

@czd890: 是的,但我想不通的是,为什么服务器如果重启一下,客户端还是可以连接的。

Adming | 园豆:119 (初学一级) | 2021-03-10 15:55

@Adming: 那问题估计没有找到点上. 可能性: 主动关闭server, server和client可能会经过完整的4个挥手过程, client能处理这种情况, 异常情况下client没有收到FIN或者处理的有问题...所以就不对路子了.

随便猜测哈, 需要更多调查, 最好是抓包看一下. 异常情况下client的tcp包是啥样的.

czd890 | 园豆:14412 (专家六级) | 2021-03-10 17:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册