如何获取socket连接状态?

时间:2020-12-29 17:24:24
我测试过 getsockopt(m_socket, SOL_SOCKET, SO_ERROR,(char*)&optval, &optlen); 
和 getsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE,(char*)&optval, &optlen);

连接还是未连接,返回值和optval都一样
怎么网上搜的都不靠谱啊 如何获取socket连接状态?

16 个解决方案

#1


getsockname试试  获取对端地址

一般查看是否连接使用心跳包

#2


通过connect的返回值,可以知道连接,如果连接中断,recv会收到0字节
如果网络异常,有可能什么信息都得不到,需要做心跳处理

#3


引用 楼主 rsdtt 的回复:
我测试过 getsockopt(m_socket, SOL_SOCKET, SO_ERROR,(char*)&optval, &optlen); 
和 getsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE,(char*)&optval, &optlen);

连接还是未连接,返回值和optval都一样
怎么网上搜的都不靠谱啊 如何获取socket连接状态?


我是希望每次发送前检查一下连接状况如何获取socket连接状态?

所以不太想用心跳包

#4


为了保证连接一般使用“心跳”方式,保证通信双方连接,原因在与来自网络底层的断开消息反映比较慢。你使用语句判断时,对于本机硬件的连接可以马上返回状态,对于已经建立的TCP连接,通过抓包可以发现,底层连接也是使用心跳保证的,在多次发送心跳不应答后,才会发送断开消息,其间可能会有几秒的时差。也就是说,本机拔掉网线会马上反应,对方拔掉网线会延时反应。
还是自己程序中加入心跳比较好。

#5


引用 1 楼 xihu1364 的回复:
getsockname试试  获取对端地址

一般查看是否连接使用心跳包


引用 2 楼 xpdavis 的回复:
通过connect的返回值,可以知道连接,如果连接中断,recv会收到0字节
如果网络异常,有可能什么信息都得不到,需要做心跳处理


我是希望每次发送前检查一下连接状况
所以不太想用心跳包

上面点错引用了 如何获取socket连接状态?

#6


你觉得不靠谱,是因为你的要求基本属于不能实现的

#7


引用 4 楼 wxhxj0268 的回复:
为了保证连接一般使用“心跳”方式,保证通信双方连接,原因在与来自网络底层的断开消息反映比较慢。你使用语句判断时,对于本机硬件的连接可以马上返回状态,对于已经建立的TCP连接,通过抓包可以发现,底层连接也是使用心跳保证的,在多次发送心跳不应答后,才会发送断开消息,其间可能会有几秒的时差。也就是说,本机拔掉网线会马上反应,对方拔掉网线会延时反应。
还是自己程序中加入心跳比较好。


看起来还是要根据错误信息来处理才行了

#8


发送前检查连接的状态,为何不直接send利用返回值查看?

#9


引用 8 楼 xihu1364 的回复:
发送前检查连接的状态,为何不直接send利用返回值查看?


如果没有别的方法就这样做最妥当了

#10


建议你使用CxClientSocket/CxServerSocket
http://www.cnblogs.com/EdmundDwyane/p/3248297.html http://www.cnblogs.com/EdmundDwyane/p/3248297.html
http://www.cnblogs.com/EdmundDwyane/p/3278641.html

#11


引用 9 楼 rsdtt 的回复:
Quote: 引用 8 楼 xihu1364 的回复:

发送前检查连接的状态,为何不直接send利用返回值查看?


如果没有别的方法就这样做最妥当了


send返回值其实也不能说明问题。

只有心跳包机制能说明问题。

#12


都是心跳包,websocket也都是这么用的

#13


都是心跳包,websocket也都是这么用的

#14


都是心跳包,websocket也都是这么用的

#15


recv一下,立刻返回0说明已经断开了

#16


不过,最可靠的方法就是心跳包。

因为如果出现突然断电、拔掉网线这些情况只能通过心跳来判断别无他法

#1


getsockname试试  获取对端地址

一般查看是否连接使用心跳包

#2


通过connect的返回值,可以知道连接,如果连接中断,recv会收到0字节
如果网络异常,有可能什么信息都得不到,需要做心跳处理

#3


引用 楼主 rsdtt 的回复:
我测试过 getsockopt(m_socket, SOL_SOCKET, SO_ERROR,(char*)&optval, &optlen); 
和 getsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE,(char*)&optval, &optlen);

连接还是未连接,返回值和optval都一样
怎么网上搜的都不靠谱啊 如何获取socket连接状态?


我是希望每次发送前检查一下连接状况如何获取socket连接状态?

所以不太想用心跳包

#4


为了保证连接一般使用“心跳”方式,保证通信双方连接,原因在与来自网络底层的断开消息反映比较慢。你使用语句判断时,对于本机硬件的连接可以马上返回状态,对于已经建立的TCP连接,通过抓包可以发现,底层连接也是使用心跳保证的,在多次发送心跳不应答后,才会发送断开消息,其间可能会有几秒的时差。也就是说,本机拔掉网线会马上反应,对方拔掉网线会延时反应。
还是自己程序中加入心跳比较好。

#5


引用 1 楼 xihu1364 的回复:
getsockname试试  获取对端地址

一般查看是否连接使用心跳包


引用 2 楼 xpdavis 的回复:
通过connect的返回值,可以知道连接,如果连接中断,recv会收到0字节
如果网络异常,有可能什么信息都得不到,需要做心跳处理


我是希望每次发送前检查一下连接状况
所以不太想用心跳包

上面点错引用了 如何获取socket连接状态?

#6


你觉得不靠谱,是因为你的要求基本属于不能实现的

#7


引用 4 楼 wxhxj0268 的回复:
为了保证连接一般使用“心跳”方式,保证通信双方连接,原因在与来自网络底层的断开消息反映比较慢。你使用语句判断时,对于本机硬件的连接可以马上返回状态,对于已经建立的TCP连接,通过抓包可以发现,底层连接也是使用心跳保证的,在多次发送心跳不应答后,才会发送断开消息,其间可能会有几秒的时差。也就是说,本机拔掉网线会马上反应,对方拔掉网线会延时反应。
还是自己程序中加入心跳比较好。


看起来还是要根据错误信息来处理才行了

#8


发送前检查连接的状态,为何不直接send利用返回值查看?

#9


引用 8 楼 xihu1364 的回复:
发送前检查连接的状态,为何不直接send利用返回值查看?


如果没有别的方法就这样做最妥当了

#10


建议你使用CxClientSocket/CxServerSocket
http://www.cnblogs.com/EdmundDwyane/p/3248297.html http://www.cnblogs.com/EdmundDwyane/p/3248297.html
http://www.cnblogs.com/EdmundDwyane/p/3278641.html

#11


引用 9 楼 rsdtt 的回复:
Quote: 引用 8 楼 xihu1364 的回复:

发送前检查连接的状态,为何不直接send利用返回值查看?


如果没有别的方法就这样做最妥当了


send返回值其实也不能说明问题。

只有心跳包机制能说明问题。

#12


都是心跳包,websocket也都是这么用的

#13


都是心跳包,websocket也都是这么用的

#14


都是心跳包,websocket也都是这么用的

#15


recv一下,立刻返回0说明已经断开了

#16


不过,最可靠的方法就是心跳包。

因为如果出现突然断电、拔掉网线这些情况只能通过心跳来判断别无他法