C#怎么判断网线掉线啦

解决方案 »

  1.   

    做一个sock程序,如果断线了。会产生一个try 你捕捉到这个try就可以了
      

  2.   

    做Socket,用try捕获异常,在拔掉网线时,可以捕获,但如果是网线没拔,而是网络断开了,好像就不能直接捕获了
      

  3.   

    用这段代码就可以判断
    uint dummy = 0;
    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
    BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
    BitConverter.GetBytes((uint)1500).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
    BitConverter.GetBytes((uint)8000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
    newRemoteSocket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
    //struct tcp_keepalive 
    //{ 
    //    u_long  onoff; //是否启用Keep-Alive
     //    u_long  keepalivetime; //多长时间后开始第一次探测(单位:毫秒)
     //    u_long  keepaliveinterval; //探测时间间隔(单位:毫秒)
    //}; 
    记得加分啊
      

  4.   

    直接PING。PING不通就表示断网了
      

  5.   

    直接ping肯定是不行的,如果人家禁止了ping入呢.
      

  6.   

    NetworkInterface.OperationalStatus 提供网络接口的配置和统计信息
      

  7.   

    NetworkInterface.GetIsNetworkAvailable ()
    如果网络连接可用,则为 true;否则为 false。 
      

  8.   

    public static void AcceptThread()
            ...{
                Thread.CurrentThread.IsBackground = true;
                while (true)
                ...{
                    uint dummy = 0;
                    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
                    BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
                    BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
                    BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
                    try
                    ...{
                        Accept(inOptionValues);
                    }
                    catch ...{ }
                }
            }        private static void Accept(byte[] inOptionValues)
            ...{
                Socket socket = Public.s_socketHandler.Accept();
                socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
                UserInfo info = new UserInfo();
                info.socket = socket;
                int id = GetUserId();
                info.Index = id;
                Public.s_userList.Add(id, info);
                socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);
            }
      

  9.   

    掉线的时候 windows 会发个通知你程序启动的时候订阅一下
    System.Net.NetworkInformation.NetworkChange 发布了两个事件: NetworkAddressChanged  Occurs when the IP address of a network interface changes.  
     NetworkAvailabilityChanged  Occurs when the availability of the network changes 
      

  10.   

    11楼的方法:NetworkInterface.GetIsNetworkAvailable () 
    如果网络连接可用,则为 true;否则为 false。 我试过,可行!但请问是否可以判断指定网卡的掉线状态?
      

  11.   


    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);public bool IsInternetConnected()
    {
    int i = 0;
    return InternetGetConnectedState(out i, 0);
    }
      

  12.   

    private void GetNetworkInterface()
    {
         if (NetworkInterface.GetIsNetworkAvailable ())
         {
              MessageBox.Show("网络连接可用!");
         }
         else
         {
              MessageBox.Show("网络连接已断开!");
         }
    }
      

  13.   

    private void GetNetworkInterface() 

        if (NetworkInterface.GetIsNetworkAvailable ()) 
        { 
              MessageBox.Show("网络连接可用!"); 
        } 
        else 
        { 
              MessageBox.Show("网络连接已断开!"); 
        } 
    }
      

  14.   


    private void GetNetworkInterface() 

        if (NetworkInterface.GetIsNetworkAvailable ()) 
        { 
              MessageBox.Show("网络连接可用!"); 
        } 
        else 
        { 
              MessageBox.Show("网络连接已断开!"); 
        } 
    }
      

  15.   


    private void GetNetworkInterface() 

        if (NetworkInterface.GetIsNetworkAvailable ()) 
        { 
              MessageBox.Show("网络连接可用!"); 
        } 
        else 
        { 
              MessageBox.Show("网络连接已断开!"); 
        } 
    }
      

  16.   

    楼上NetworkInterface.GetIsNetworkAvailable 的方法是判断所有的网卡连接,但我要得知两个网卡或多个网卡时某一单个网卡是否掉线就无法判断了
      

  17.   


    try catch 这个捕获socketexception就可以了
      

  18.   

    int   getNICStatus()  
      {  
      PPACKET_OID_DATA     oidData;                   //   Defined   in   Ntddpack.h  
      unsigned   int             buffLen;     //   OID   memory   allocation  
      unsigned   long     nRet;  
       
      buffLen   =   sizeof(PACKET_OID_DATA)   +   sizeof(unsigned   long)   -   1;  
      oidData   =   (PPACKET_OID_DATA)   GlobalAllocPtr(GMEM_MOVEABLE   |   GMEM_ZEROINIT,   buffLen);  
      if   (oidData   ==   NULL)  
      return   FALSE;  
       
      oidData->Oid   =   OID_GEN_MEDIA_CONNECT_STATUS;  
      oidData->Length   =   sizeof(unsigned   long);  
       
      if   ((PacketRequest(lpAdapter,0,   oidData))   >   0)  
      {  
      nRet     =   *(unsigned   long   *)oidData->Data;  
      GlobalFreePtr(oidData);  
      return   nRet;  
      }  
      else  
      {  
      GlobalFreePtr(oidData);  
      return   FALSE;  
      }  
      }   
      

  19.   


    定时检测每个adapter的状态
      

  20.   

    <code>
     NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);//这个可以判断网络可用性的判断        void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
            {
               // throw new NotImplementedException();
                //网络可用性变化的事件处理            
            }
    /// <summary>
            /// 显示网络适配器的信息
            /// </summary>
            /// <returns></returns>
            public bool DisplayDnsConfiguration()
            {
                NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
                 listBox1.Items.Clear();
                foreach (NetworkInterface adapter in adapters)
                {
                    string str = adapter.Name + "......." + adapter.OperationalStatus;
                 
                    listBox1.Items.Add(str);
                    if (adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        MessageBox.Show("有网络连接可用");
                        return true;
                    }
                }
                return false;
            }</code>