socket通信时,拔网线,客户端做一些什么,可以让服务端一断线,就关闭接口口

꧁༺舒月༻꧂ 2018-10-30 10:49:09
我有一个服务器,这个服务器是别人提供的,我做一个客户端,获取服务器中的一些数据。
通信过程中,如果突然拔掉网线。
我再启动客户端,运行connect函数,就连接不上服务器了。(因为该服务器只开放了一个端口)。
我在通信的时候拔掉网线时候,没有运行closeSocket函数。所以导致服务端的端口一直被占用。

有什么方法,在我客户端做一些处理,在和服务器通信的时候,告诉服务器我不回复你一段时间,就自己实现关闭端口吧?
我这边有其他的测试客户端,人家的客户端就能实现断线后,服务端口就能释放。不知道是什么技术实现的。

心跳包我这几天也在看,但是心跳包好像需要服务器的配合,但是服务器不是我开发的,已经是现成的代码了,
而且其他的成品客户端我说的功能可以实现。

keeplive机制应用,会影响正常的连接,也在客户端代码实装了,但是效果也不好。

有谁遇到这种情况,请指教一下。小妹,在这里谢过了。
...全文
492 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
꧁༺舒月༻꧂ 2018-11-08
  • 打赏
  • 举报
回复
我来结贴了,个人的技术有限。

通过各种测试以及心跳机制实现等操作,后来发现可能在客户端执行完connect函数连接后,
就开一个接收线程(该线程写成了死循环)。

后来就将开启线程的操作挪到了发送函数的后面。然后线程只执行一次接收操作。
通过各种读帖和有大家热心的讲解了解,TCP/IP通信在突然断掉的情况下,客户端和服务器双方都还有连接的,
所以在断线瞬间,在插上网线还是继续可以通信的。

10楼说的没错,服务端开发人员用的是W5500芯片,确实就开了一个端口。
xian_wwq 2018-11-08
  • 打赏
  • 举报
回复
1.如果别的客户端断开后能够连接,那可以排除server的问题;
2.相对于server这一侧,client的处理简单的多
只要socket通信中出现错误,不管是什么原因引起的,先shutdown后close
然后重新new个socket,重复之前的连接操作就可以了

赵4老师 2018-11-07
  • 打赏
  • 举报
回复
逆向测试工具
不易易 2018-11-07
  • 打赏
  • 举报
回复
引用 7 楼 weixin_42123784 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:]
使用不同的Socket代理。


请赵老师在说的详细一些?我现有的服务端代码只开了一个端口。


上面的是我的一个TCP/IP测试工具。还有我自己的写的一个客户端。

我做的操作是:1.其中一个连接服务器-拔掉网线-另一个客户端连接
2.连接服务器-拔掉网线-断开服务器
测试工具怎么弄都能连上,但是我做的客户端,只要拔掉网线,断开服务器。
服务器端口就一直占用,给人的感觉就像代码留了个处理尾巴没处理好。只能重启服务器。

[/quote]
你的意思是:测试工具拔掉网线再连能连上,而你的客户端这样就连不上是吗?
楼主解决了吗?关注中。。。。。。。
睡在床板下_ 2018-11-02
  • 打赏
  • 举报
回复
tcp套接字有超时时间; 楼主反馈的拔网线,tcp协议栈是感知不到的,只能用keepalive 实现。
翅膀又硬了 2018-11-02
  • 打赏
  • 举报
回复
用win10,拔网线的错误,系统会检测到通知程序,可以试试。低版本的window系统不行。。
smwhotjay 2018-10-30
  • 打赏
  • 举报
回复

各自管各自的啊
zgl7903 2018-10-30
  • 打赏
  • 举报
回复
正常的服务器和客户端都应该自己处理, 短线了怎么可能再去通知对方?
꧁༺舒月༻꧂ 2018-10-30
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
试试 WSACreateEvent WSAEventSelect 一个 FD_CLOSE 的事件, 然后WSAWaitForMultipleEvents监视这个关闭事件


我刚刚看了下您给的这个事件和方法,但是我找到的都是在服务端实装实时检测FD_CLOSE 的事件https://www.cnblogs.com/hgwang/p/6101405.html移除以断开的端口。

不修改服务器的情况下,只写客户端代码。通过给服务器一个标识,断线了,我就不和你链接了。来一个提前约定有这中能够处理吗?
꧁༺舒月༻꧂ 2018-10-30
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
试试 WSACreateEvent WSAEventSelect 一个 FD_CLOSE 的事件, 然后WSAWaitForMultipleEvents监视这个关闭事件


好的 我试着实装一下,谢谢您指点。
zgl7903 2018-10-30
  • 打赏
  • 举报
回复
试试 WSACreateEvent WSAEventSelect 一个 FD_CLOSE 的事件, 然后WSAWaitForMultipleEvents监视这个关闭事件
  • 打赏
  • 举报
回复
告诉你,这个想法没法实现
因为你不了解socket的原理,socket建立的连接,只是在双方程序那里做了个标志,实际网线上无有任何东西的,这时候网线拨了,对于服务端是没有任何感觉的,所以服务端会一直不做任何处理,然后直到服务端的keepalive起做用,发送协议层的报文来探测连接,才能发现客户端已经不存在了,会做断开连接的动做,而这也正是keepalive存在的根本用处,可你的服务端代码无法修改,那么断线后只能硬等服务端的keepalive,没有别的办法,除非修改服务端代码,心路包,或者有新连接就探测客户端连接,或者把服务端的keepalive三个参数设置的尽可能小(尽可能小也是很长时间)
zgl7903 2018-10-30
  • 打赏
  • 举报
回复
服务器端口一直占用, 只能重启服务器?
这个应该是服务器端没有做好, 猜测是服务器端只监听并只允许一个客户 (listen(s, 1)), 适当的把允许数调大, 而且Accept时创建新的通讯线程
꧁༺舒月༻꧂ 2018-10-30
  • 打赏
  • 举报
回复
引用 8 楼 smwhotjay 的回复:
那就是你的客户端没写好!!!


确实是我的客户端没写好,但是我不知道技术点在哪里,所以来发帖问大神们的呀。
smwhotjay 2018-10-30
  • 打赏
  • 举报
回复
那就是你的客户端没写好!!!
꧁༺舒月༻꧂ 2018-10-30
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
使用不同的Socket代理。


请赵老师在说的详细一些?我现有的服务端代码只开了一个端口。


上面的是我的一个TCP/IP测试工具。还有我自己的写的一个客户端。

我做的操作是:1.其中一个连接服务器-拔掉网线-另一个客户端连接
2.连接服务器-拔掉网线-断开服务器
测试工具怎么弄都能连上,但是我做的客户端,只要拔掉网线,断开服务器。
服务器端口就一直占用,给人的感觉就像代码留了个处理尾巴没处理好。只能重启服务器。

赵4老师 2018-10-30
  • 打赏
  • 举报
回复
使用不同的Socket代理。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧