检测网线拔出

来源:互联网 发布:mac安装windows程序 编辑:程序博客网 时间:2024/05/02 04:22

主机和客户机网口通信,已建立socket连接,当网线拔出的时候,如何检测到?
或者说当拔掉电脑上的网线时,如何编程检测到这个情况,高手帮忙,谢谢!
  
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:20
  • xianglitian用户头像
  • xianglitian
  • (向立天)
  • 等 级:
  • 4

#1楼 得分:0回复于:2010-11-01 22:42:34
可以通过心跳检测机制
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:狄仁杰--宦海浮沉,心系民生
  • VisualEleven用户头像
  • VisualEleven
  • (Eleven[兔子党组织部长])
  • 等 级:
  • 7

#2楼 得分:0回复于:2010-11-01 22:43:55
InternetGetConnectedState函数可以得到当前网络的连接状态
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:开源共享,自己写的界面及图象库,欢迎捧场。
  • self001用户头像
  • self001
  • (self001)
  • 等 级:
#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的)
 
  • 对我有用[2]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:[冒死发帖]dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法~
  • weblai用户头像
  • weblai
  • (weblai)
  • 等 级:
#4楼 得分:0回复于:2010-11-02 08:22:55
3楼的很全面。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:多线程同步的两个问题,可能需要高手,请关注!
  • lijianli9用户头像
  • lijianli9
  • (清秋)
  • 等 级:
#7楼 得分:0回复于:2010-11-02 08:49:15
如果是SOCKET通讯的话,建议使用心跳包。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • Wang471981125用户头像
  • Wang471981125
  • (子鱼)
  • 等 级:
#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

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

帮顶
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • TA_V_SFIQ_SFIQ用户头像
  • TA_V_SFIQ_SFIQ
  • 等 级:
#9楼 得分:0回复于:2010-11-02 09:21:29
以前看过好像有一个回调函数的
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • TA_V_SFIQ_SFIQ用户头像
  • TA_V_SFIQ_SFIQ
  • 等 级:
#10楼 得分:0回复于:2010-11-02 09:26:51
http://topic.csdn.net/t/20030725/23/2073376.html
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jackson35296用户头像
  • jackson35296
  • (虾哥)
  • 等 级:
#11楼 得分:0回复于:2010-11-02 09:32:18
TCP通信方式不建议用心跳包。

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

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

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

IOCP模型下GetQueuedCompletionStatus()返回0,且GetLastError() != WAIT_TIMEOUT标示连接断开
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • xiayadong用户头像
  • xiayadong
  • (alphaxyd_1)
  • 等 级:
#13楼 得分:0回复于:2010-11-02 11:19:14
心跳包!
我记得拔出网线后,socket连接是没有任何反应的!
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • wonsea用户头像
  • wonsea
  • (wonsea)
  • 等 级:
#14楼 得分:0回复于:2010-11-02 11:50:51
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jackson35296用户头像
  • jackson35296
  • (虾哥)
  • 等 级:
#15楼 得分:0回复于:2010-11-02 12:47:53
引用 14 楼 wonsea 的回复:
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;


没用过WSAGetLastError()?
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • sunshine716用户头像
  • sunshine716
  • (我爱kitty猫)
  • 等 级:
#16楼 得分:0回复于:2010-11-02 13:23:37
用InternetGetConnectedStateEx函数
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • jhayumu用户头像
  • jhayumu
  • (jhayumu)
  • 等 级:
#17楼 得分:0回复于:2010-11-02 13:32:58
3楼的代码很全面
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • arpnet99用户头像
  • arpnet99
  • (♫ 熊猫党团委副书记 ♪)
  • 等 级:
#18楼 得分:0回复于:2010-11-02 14:01:33
引用 11 楼 jackson35296 的回复:

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


很多情况TCP连接是不能给出提示的。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • yunchao630用户头像
  • yunchao630
  • (Lucifer)
  • 等 级:
#20楼 得分:0回复于:2010-11-02 16:13:08
+1
引用 14 楼 wonsea 的回复:
TCP
1.如果是本机拔掉网线,无论阻塞非阻塞socket,都会立即返回SOCKET_ERROR;
2.如果是对方拨网线,本地TCP层是不会收到FIN的,所以只能用超时检查或者心跳来确定是否连接断开;

原创粉丝点击