如何检测TCP网络连接状态?

tigerfox 2004-11-07 10:50:50
通过SOCKET检测TCP网络连接。

我用过getpeername(),但这只对正常连接中断时有效,但对于硬件连接中断没有效果。
我想用ping但,但怕增大网络流量。

还有没有其它办法呢??
...全文
785 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sayo 2004-11-09
  • 打赏
  • 举报
回复
继续GZ
nonocast 2004-11-08
  • 打赏
  • 举报
回复
MSN做得很好的啊
他是怎么搞得?
hundlom 2004-11-08
  • 打赏
  • 举报
回复
转自驱动开发网
发信人: rain (夜猫子大王), 信区: SysInternals
标 题: Re: 请问实时发现网络down掉的原理?(转载)
发信站: 武汉白云黄鹤站 (2001年03月31日09:57:05 星期六), 转信

实时检测网线被拔掉是需要网卡设备驱动程序支持的,
如果驱动程序不支持是无法实现的,NDIS4要求设备驱动程序
最好提供CheckForHangHandler回调函数。2000会每隔2秒钟
调用此函数。驱动程序在此函数中检查网卡连线状态,
如果发生了改变,即拔去了网线或接上了网线,
驱动程序就会调用NdisMIndicateStatus通知所有的上层NDIS协议驱动程序.
其中: NDIS_STATUS_MEDIA_DISCONNECT 指示网线被拔掉,
NDIS_STATUS_MEDIA_CONNECT 指示网线被接上
NDIS_STATUS_LINK_SPEED_CHANGE 指示网卡速度改变,10/100自适应网卡才有。
网卡一般都有 status register 指示当然的连线状态,
也有网卡是通过获得 led status 来知道当前的连线状态的,
即绿灯亮表示连线,灭表示没有。
有些网卡拔掉或接上网线时会产生中断,在中断处理程序中一般也
检测网络连线状态并调用NdisMIndicateStatus,这样连线状态
在2000中就实时反应出来了,否则会在2秒钟内,即NDIS调用CheckForHangHandler后。

这个功能是微软在PC97规范中定义的,所以ndis3没有这个功能。
linux对这个没有要求,novell netware对这个有要求,其它的操作系统我也不清楚。
sayo 2004-11-08
  • 打赏
  • 举报
回复
这是我的一段检测程序,用在自定义的一个线程中,请讨论一下:

DWORD WINAPI CSetSocket::CheckConThread(LPVOID lParam)
{
CSetSocket *pss = (CSetSocket *)lParam;

fd_set fs;
TIMEVAL tm;
int nRet, nLen = 32;
char lpRecv[32];

while(pss->m_bCheckCon)
{
fs.fd_count = 1;
fs.fd_array[0] = pss->m_Socket;
tm.tv_sec = 0;
tm.tv_usec = 300;
nRet = select(0, &fs, NULL, NULL, &tm);
if(0 == nRet) //time out
{
continue;
}else if(1 == nRet)
{
Sleep(50);
nRet = recv(pss->m_Socket, lpRecv, 32, 0);
if(0 == nRet)
//if(!pss->RecvData(lpRecv, &nLen))
{
//call the callback function for the completetion of the connection
if(pss->m_pCallBack)
{
pss->m_pCallBack();
}
pss->m_bConnected = FALSE;
pss->m_bCheckCon = FALSE;
pss->m_hCheckThread = NULL;

break;
}else{
continue;
}
}else if(SOCKET_ERROR == nRet)
{
break;
}

}

return 0;
}
Caps77 2004-11-08
  • 打赏
  • 举报
回复
这个问题一直没有准确的回答,关注一下
gdy119 2004-11-08
  • 打赏
  • 举报
回复
学习!
Micro_Sheng 2004-11-08
  • 打赏
  • 举报
回复
UP一下,学习中......
sharkhuang 2004-11-07
  • 打赏
  • 举报
回复
有个keeplive参数
oyljerry 2004-11-07
  • 打赏
  • 举报
回复
硬件中断会发一个RST包
Lightest 2004-11-07
  • 打赏
  • 举报
回复
硬件连接中断几乎没法检查出来.最简单的办法就是在TCP连接上周期发送检测包
kingzai 2004-11-07
  • 打赏
  • 举报
回复
tlhelp32.h和iphlpapi.lib,能检测出当前的TCP/IP连接状态和连接表。
也就是netstat.exe
1。取得TCP连接表函数:::GetTcpTable();
2.取得UPD监听者表函数:::GetUdpTable();
3.取得IP协议统计情况函数:::GetIpStatistics();

18,355

社区成员

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

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