C++ SOCKET在客户端不正常断开的时候如何重新监听。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ SOCKET在客户端不正常断开的时候如何重新监听。相关的知识,希望对你有一定的参考价值。

如题。谢谢了

如果用的是CS模式,一般流程如下:
1,客户端非正常断开了,服务器可以得到掉线的信号。服务器的端口是正常的,这个时候,只能是客户端主动连接服务器端。
2,如果是客户端断开,或是发送数据超时了,或是得不到服务器的回应;这时可以关闭端口,重新打开,并与服务器取得联系。
3,在无线链路或是网络复杂的情况下,应在协议中加入心跳包,一方面可以达到互相校验通讯状态,一方面可以保持链接的超时掉线。
参考技术A 服务器端设置一个connect线程,每隔一定时间就去检查是否能够正常发送数据,如果不可以,自动重新连接。本回答被提问者采纳 参考技术B char MyData;
改成
char MyData[100];
然后DataPoint= &MyData;
改成DataPoint= MyData;
这样试试

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户端发送同样的内容

参考技术A 一:
如果客户端关闭连接,服务器端会收到一条连接关闭的消息,对应到你的C函数API就是,使用recv(或者read),读出的大小为0,此时就表明客户端断开连接了,如果是TCP的话,你也调用一次close(或者shutdown),这样就可以把一个TCP连接完美优雅的断开。
二:
服务器编程肯定会在accept新连接之后,保存在一个数据结构中的。发送同样的内容,只需要遍历此数据结构即可。
参考技术B

    recv函数返回0。

    如果是长连接,可以通过心跳包实现。

参考技术C 长连接需要用心跳包来保持连接 如果超过N个心跳包没有了说明客户端掉线了 默认情况下TCP连接有一个默认超时时间(即N秒没有通讯就自动转time_wait)
另外服务端在编写代码的时候应该把连接上的客户端的socket放到一个socket队列(用于存储在线的客户端) 每个发送一次 你就轮询一次发送一次就好了

UDP不再讨论范围内

以上是关于C++ SOCKET在客户端不正常断开的时候如何重新监听。的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 通过 id 断开客户端

C# socket 如何断开连接

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户

nodejs socket 怎么检测客户端主动断开连接

Socket.IO-client.java 反复断开重连

java socket 模拟im 即时通讯