现在的位置: 首页 > 综合 > 正文

检测网线拔出

2013年10月06日 ⁄ 综合 ⁄ 共 4656字 ⁄ 字号 评论关闭
主机和客户机网口通信,已建立socket连接,当网线拔出的时候,如何检测到?
或者说当拔掉电脑上的网线时,如何编程检测到这个情况,高手帮忙,谢谢!
 
 

回复次数:20

#1楼 得分:0回复于:2010-11-01 22:42:34

可以通过心跳检测机制
 
  • VisualEleven用户头像
  • VisualEleven
  • (Eleven[兔子党组织部长])
  • 等 级:
  • 7

#2楼 得分:0回复于:2010-11-01 22:43:55

InternetGetConnectedState函数可以得到当前网络的连接状态
 
#3楼 得分:0回复于:2010-11-01 22:55:55

#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的)

 
  • weblai用户头像
  • weblai
  • (weblai)
  • 等 级:
#4楼 得分:0回复于:2010-11-02 08:22:55

3楼的很全面。
 
#7楼 得分:0回复于:2010-11-02 08:49:15

如果是SOCKET通讯的话,建议使用心跳包。
 
#8楼 得分:0回复于:2010-11-02 08:49:43

引用 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

//////////……

帮顶

 
#9楼 得分:0回复于:2010-11-02 09:21:29

以前看过好像有一个回调函数的
 
#10楼 得分:0回复于:2010-11-02 09:26:51

http://topic.csdn.net/t/20030725/23/2073376.html
 
#11楼 得分:0回复于:2010-11-02 09:32:18

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

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

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

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

IOCP模型下GetQueuedCompletionStatus()返回0,且GetLastError() != WAIT_TIMEOUT标示连接断开

 
#13楼 得分:0回复于:2010-11-02 11:19:14

心跳包!
我记得拔出网线后,socket连接是没有任何反应的!
 
  • wonsea用户头像
  • wonsea
  • (wonsea)
  • 等 级:
#14楼 得分:0回复于:2010-11-02 11:50:51

TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;
 
#15楼 得分:0回复于:2010-11-02 12:47:53

引用 14 楼 wonsea 的回复:

TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;

没用过WSAGetLastError()?

 
#16楼 得分:0回复于:2010-11-02 13:23:37

用InternetGetConnectedStateEx函数
 
#17楼 得分:0回复于:2010-11-02 13:32:58

3楼的代码很全面
 
  • arpnet99用户头像
  • arpnet99
  • (♫ 熊猫党团委副书记 ♪)
  • 等 级:
#18楼 得分:0回复于:2010-11-02 14:01:33

引用 11 楼 jackson35296 的回复:

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

很多情况TCP连接是不能给出提示的。

 
#20楼 得分:0回复于:2010-11-02 16:13:08

+1

引用 14 楼 wonsea 的回复:

TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;

抱歉!评论已关闭.