TCP服务端能否主动让客户端连接?

时间:2021-12-24 14:59:27
现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?

18 个解决方案

#1


这个想法太前卫了

如果服务器能主动通知到客户端再连接上来,
那么这个通知的过程就已经建立了连接了,
如果客户端能收到服务器的通知的话,就不需要再去连服务器了

服务端主动连客户端,
那么需要客户端开启了监听端口,并告诉服务器这个端口号
服务端保存上次客户端连接时对应的ip和端口,这样才能主动连回去

#2


楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。

#3


感觉不修改客服端是不能做到的吧。作为服务端是被动接受连接的吧。除非你客服端有accept才能反向发起连接。

#4


我感觉 lz这个需求 和 socket连接池 的概念很相似,但是这个 高深的socket连接池 就是不知道在哪儿。

#5


改服务端呗,为什么客户端连上了,还给释放了呢?

#6


可以让客户端也有服务端的被连功能,用于通知。
不一定TCP,
用 UDP,HTTP都可以。

#7


引用 2 楼 wjb_yd 的回复:
楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。

是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了

#8


这玩法,其实是要在连接问题上完全控制客户端

#9


引用 7 楼 inurlcn 的回复:
引用 2 楼 wjb_yd 的回复:楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。
是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了


lz要知道 socket端口号是复用的
A连接B 在B上会给A分配一个号 这就是socket
当你断掉一个连接之后 再有别的连接连上来
之前分配的这个号码是有可能重新分配给了新的连接的
所以你把TCP连接信息存起来是没有用的

#10


客户端不改,怎么行。。

   有一个想法: 服务端 发一个UDP消息过去,客户端收到UDP,然后主动连服务端的TCP端口。。 0 0

#11


引用 楼主 inurlcn 的回复:
现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?


其实在这个问题上 有一点楼主需要说明的是
“由于某些原因,服务端释放了此次连接”
此时服务端有没有close(socket)
客户端有没有类似心跳包的检查,发现连接断掉之后也close(socket)
楼主所说的“释放”到底是free了内存,还是close了连接

如果两边都没有close,则连接依然是通的,
如果楼主在别的地方保存了free之前的socket信息,则可以恢复
任意一边close了则无法再回复,只能重新连接

#12


引用 9 楼 zilaishuichina 的回复:
引用 7 楼 inurlcn 的回复:引用 2 楼 wjb_yd 的回复:楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。
是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了

lz要知道 socket端口号是复用的……


我这SOCKER和PORT是绑定的

#13


引用 11 楼 zilaishuichina 的回复:
引用 楼主 inurlcn 的回复:现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?

其实在这个问题上 有一点楼主需要说明的是
“由于某些原因,……


TCP服务端能否主动让客户端连接?其实就是把服务端重启了下

这个“心跳包”的间隔是多少?

#14


引用 13 楼 inurlcn 的回复:
引用 11 楼 zilaishuichina 的回复:引用 楼主 inurlcn 的回复:现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?

其实在……


心跳包是逻辑自己定的

服务器都重启了 那更没法恢复了 只能让客户端重连

#15


税务局能否主动让纳税人纳税? TCP服务端能否主动让客户端连接?

#16


引用 15 楼 zhao4zhong1 的回复:
税务局能否主动让纳税人纳税?

TCP服务端能否主动让客户端连接?可不可以恢复TCP连接

#17


引用 15 楼 zhao4zhong1 的回复:
税务局能否主动让纳税人纳税?

参考*是怎么抓那些偷税漏税的不法分子的。 TCP服务端能否主动让客户端连接?

#18


改用UDP吧

#1


这个想法太前卫了

如果服务器能主动通知到客户端再连接上来,
那么这个通知的过程就已经建立了连接了,
如果客户端能收到服务器的通知的话,就不需要再去连服务器了

服务端主动连客户端,
那么需要客户端开启了监听端口,并告诉服务器这个端口号
服务端保存上次客户端连接时对应的ip和端口,这样才能主动连回去

#2


楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。

#3


感觉不修改客服端是不能做到的吧。作为服务端是被动接受连接的吧。除非你客服端有accept才能反向发起连接。

#4


我感觉 lz这个需求 和 socket连接池 的概念很相似,但是这个 高深的socket连接池 就是不知道在哪儿。

#5


改服务端呗,为什么客户端连上了,还给释放了呢?

#6


可以让客户端也有服务端的被连功能,用于通知。
不一定TCP,
用 UDP,HTTP都可以。

#7


引用 2 楼 wjb_yd 的回复:
楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。

是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了

#8


这玩法,其实是要在连接问题上完全控制客户端

#9


引用 7 楼 inurlcn 的回复:
引用 2 楼 wjb_yd 的回复:楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。
是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了


lz要知道 socket端口号是复用的
A连接B 在B上会给A分配一个号 这就是socket
当你断掉一个连接之后 再有别的连接连上来
之前分配的这个号码是有可能重新分配给了新的连接的
所以你把TCP连接信息存起来是没有用的

#10


客户端不改,怎么行。。

   有一个想法: 服务端 发一个UDP消息过去,客户端收到UDP,然后主动连服务端的TCP端口。。 0 0

#11


引用 楼主 inurlcn 的回复:
现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?


其实在这个问题上 有一点楼主需要说明的是
“由于某些原因,服务端释放了此次连接”
此时服务端有没有close(socket)
客户端有没有类似心跳包的检查,发现连接断掉之后也close(socket)
楼主所说的“释放”到底是free了内存,还是close了连接

如果两边都没有close,则连接依然是通的,
如果楼主在别的地方保存了free之前的socket信息,则可以恢复
任意一边close了则无法再回复,只能重新连接

#12


引用 9 楼 zilaishuichina 的回复:
引用 7 楼 inurlcn 的回复:引用 2 楼 wjb_yd 的回复:楼主去看一下TCP三次握手,建立连接的过程,就会发现,你说的事情,不修改客户端,是不可能实现的。。。
是不是不给客户端发送 FIN ,客户端就不知道当前连接已经断开了? (可能还有其他的判断标准)
把当前服务端TCP连接信息给存起来, 不就可以恢复了

lz要知道 socket端口号是复用的……


我这SOCKER和PORT是绑定的

#13


引用 11 楼 zilaishuichina 的回复:
引用 楼主 inurlcn 的回复:现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?

其实在这个问题上 有一点楼主需要说明的是
“由于某些原因,……


TCP服务端能否主动让客户端连接?其实就是把服务端重启了下

这个“心跳包”的间隔是多少?

#14


引用 13 楼 inurlcn 的回复:
引用 11 楼 zilaishuichina 的回复:引用 楼主 inurlcn 的回复:现在TCP服务端已经accept了客户端的connect 

由于某些原因,服务端释放了此次连接

但是还想重新建立这个连接,有没有什么方法能通知客户端再来主动连接?

现在的情况是无法修改客户端的代码,只能从服务端入手。
服务端能保存当前的连接再恢复吗?

其实在……


心跳包是逻辑自己定的

服务器都重启了 那更没法恢复了 只能让客户端重连

#15


税务局能否主动让纳税人纳税? TCP服务端能否主动让客户端连接?

#16


引用 15 楼 zhao4zhong1 的回复:
税务局能否主动让纳税人纳税?

TCP服务端能否主动让客户端连接?可不可以恢复TCP连接

#17


引用 15 楼 zhao4zhong1 的回复:
税务局能否主动让纳税人纳税?

参考*是怎么抓那些偷税漏税的不法分子的。 TCP服务端能否主动让客户端连接?

#18


改用UDP吧