怎样检测网线拔出?

feichester 2010-11-01 10:35:29
主机和客户机网口通信,已建立socket连接,当网线拔出的时候,如何检测到?
或者说当拔掉电脑上的网线时,如何编程检测到这个情况,高手帮忙,谢谢!
...全文
1217 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackson35296 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wonsea 的回复:]
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;
[/Quote]

没用过WSAGetLastError()?
wonsea 2010-11-02
  • 打赏
  • 举报
回复
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;
xiayadong 2010-11-02
  • 打赏
  • 举报
回复
心跳包!
我记得拔出网线后,socket连接是没有任何反应的!
jackson35296 2010-11-02
  • 打赏
  • 举报
回复
TCP通信方式不建议用心跳包。

阻塞模式下
recv()函数返回-1,就表示连接断开,无论是拔出网线还是主机关闭套接字

非阻塞模式下,recv()或send函数返回-1,且WSAGetLastError()为
WSAENETRESET或WSAECONNRESET表示连接断开

select模型下第四个参数存放的套接字为错误的套接字,也能标示该套接字相关的连接已断开

IOCP模型下GetQueuedCompletionStatus()返回0,且GetLastError() != WAIT_TIMEOUT标示连接断开
TA_V_SFIQ_SFIQ 2010-11-02
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20030725/23/2073376.html
TA_V_SFIQ_SFIQ 2010-11-02
  • 打赏
  • 举报
回复
以前看过好像有一个回调函数的
Wang471981125 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 self001 的回复:]

#include "stdafx.h"
#include "test.h"
#include <Wininet.h>
#include <Sensapi.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//////////……
[/Quote]
帮顶
lijianli9 2010-11-02
  • 打赏
  • 举报
回复
如果是SOCKET通讯的话,建议使用心跳包。
weblai 2010-11-02
  • 打赏
  • 举报
回复
3楼的很全面。
翅膀又硬了 2010-11-02
  • 打赏
  • 举报
回复
+1[Quote=引用 14 楼 wonsea 的回复:]
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;
[/Quote]
这不是鸭头 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jackson35296 的回复:]

TCP通信方式不建议用心跳包。

[/Quote]
很多情况TCP连接是不能给出提示的。
jhayumu 2010-11-02
  • 打赏
  • 举报
回复
3楼的代码很全面
sunshine716 2010-11-02
  • 打赏
  • 举报
回复
用InternetGetConnectedStateEx函数
self001 2010-11-01
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "test.h"
#include <Wininet.h>
#include <Sensapi.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

void Fun_InternetGetConnectedState()
{

//#define INTERNET_CONNECTION_MODEM 1
//#define INTERNET_CONNECTION_LAN 2
//#define INTERNET_CONNECTION_PROXY 4
//#define INTERNET_CONNECTION_MODEM_BUSY 8

DWORD flags;//上网方式
BOOL m_bOnline=TRUE;//是否在线

m_bOnline=InternetGetConnectedState(&flags,0);
if(m_bOnline)//在线
{
if ((flags & INTERNET_CONNECTION_MODEM) ==INTERNET_CONNECTION_MODEM)
{
cout<<"在线:拨号上网\n";
}
if ((flags & INTERNET_CONNECTION_LAN) ==INTERNET_CONNECTION_LAN)
{
cout<<"在线:通过局域网\n";
}
if ((flags & INTERNET_CONNECTION_PROXY) ==INTERNET_CONNECTION_PROXY)
{
cout<<"在线:代理\n";
}
if ((flags & INTERNET_CONNECTION_MODEM_BUSY) ==INTERNET_CONNECTION_MODEM_BUSY)
{
cout<<"MODEM被其他非INTERNET连接占用\n";
}
}
else
cout<<"不在线\n";
}

void Fun_IsNetworkAlive()
{

DWORD flags;//上网方式
BOOL m_bOnline=TRUE;//是否在线

m_bOnline=IsNetworkAlive(&flags);
if(m_bOnline)//在线
{
if ((flags & NETWORK_ALIVE_LAN) ==NETWORK_ALIVE_LAN)
{
cout<<"在线:NETWORK_ALIVE_LAN\n";
}
if ((flags & NETWORK_ALIVE_WAN) ==NETWORK_ALIVE_WAN)
{
cout<<"在线:NETWORK_ALIVE_WAN\n";
}
if ((flags & NETWORK_ALIVE_AOL) ==NETWORK_ALIVE_AOL)
{
cout<<"在线:NETWORK_ALIVE_AOL\n";
}
}
else
cout<<"不在线\n";
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
// CString strHello;
// strHello.LoadString(IDS_HELLO);
// cout << (LPCTSTR)strHello << endl;
int i=0;
while (TRUE)
{
cout << "请选择测试的方式:\n"
<< "1. InternetGetConnectedState\n"
<< "2. IsNetworkAlive"
<< endl;
cin >> i;
switch(i)
{
case 1:
Fun_InternetGetConnectedState();
break;
case 2:
Fun_IsNetworkAlive();
break;
default:
cout << "错误!\n";
}
cout << endl;
}

}

return nRetCode;
}

说明:
InternetGetConnectedState():对网络状况不能及时反应
IsNetworkAlive():可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。使用该函数,需要安装最新的SDK(如.net的)

Eleven 2010-11-01
  • 打赏
  • 举报
回复
InternetGetConnectedState函数可以得到当前网络的连接状态
向立天 2010-11-01
  • 打赏
  • 举报
回复
可以通过心跳检测机制

18,357

社区成员

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

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