ping主机查看是否处于连接状态

来源:互联网 发布:民国知乎 编辑:程序博客网 时间:2024/04/30 11:02
namespace Common 

    
using System; 
    
using System.Net; 
    
using System.Net.Sockets; 
    
public class Ping 
    

        
const int SOCKET_ERROR = -1
        
const int ICMP_ECHO = 8



        
public static string PingH(string host,out bool isLink) 
        

            isLink
=false;
            
string tmp="";
            IPHostEntry serverHE, fromHE; 
            
int nBytes = 0
            
int dwStart = 0, dwStop = 0
            Socket socket 
= 
                
new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); 
            socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,
500);

            
try 
            

                serverHE 
= Dns.GetHostByName(host); 
            }
 
            
catch(Exception) 
            

                Console.WriteLine(
"Host not found"); 
                
return "Host not found"
            }
 

            IPEndPoint ipepServer 
= new IPEndPoint(serverHE.AddressList[0], 0); 
            EndPoint epServer 
= (ipepServer); 

            fromHE 
= Dns.GetHostByName(Dns.GetHostName()); 
            IPEndPoint ipEndPointFrom 
= new IPEndPoint(fromHE.AddressList[0], 0); 
            EndPoint EndPointFrom 
= (ipEndPointFrom); 

            
int PacketSize = 0
            IcmpPacket packet 
= new IcmpPacket(); 
            packet.Type 
= ICMP_ECHO; 
            packet.SubCode 
= 0
            packet.CheckSum 
= UInt16.Parse("0"); 
            packet.Identifier 
= UInt16.Parse("45"); 
            packet.SequenceNumber 
= UInt16.Parse("0"); 
            
int PingData = 32
            packet.Data 
= new Byte[PingData]; 
            
for (int i = 0; i < PingData; i++
            

                packet.Data[i] 
= (byte)'#'
            }
 

            PacketSize 
= PingData + 8
            Byte [] icmp_pkt_buffer 
= new Byte[ PacketSize ]; 
            Int32 Index 
= 0
            Index 
= Serialize( 
                packet, 
                icmp_pkt_buffer, 
                PacketSize, 
                PingData ); 
            
if( Index == -1 ) 
            

                Console.WriteLine(
"Error in Making Packet"); 
                
return "Error in Making Packet"
            }
 


            Double double_length 
= Convert.ToDouble(Index); 
            Double dtemp 
= Math.Ceiling( double_length / 2); 
            
int cksum_buffer_length = Convert.ToInt32(dtemp); 
            UInt16 [] cksum_buffer 
= new UInt16[cksum_buffer_length]; 
            
int icmp_header_buffer_index = 0
            
forint i = 0; i < cksum_buffer_length; i++ ) 
            

                cksum_buffer[i] 
= 
                    BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index); 
                icmp_header_buffer_index 
+= 2
            }
 
            UInt16 u_cksum 
= checksum(cksum_buffer, cksum_buffer_length); 
            packet.CheckSum 
= u_cksum; 

            Byte [] sendbuf 
= new Byte[ PacketSize ]; 
            Index 
= Serialize( 
                packet, 
                sendbuf, 
                PacketSize, 
                PingData ); 
            
if( Index == -1 ) 
            

                Console.WriteLine(
"Error in Making Packet"); 
                
return "Error in Making Packet"
            }
 


            dwStart 
= System.Environment.TickCount; 
            
if ((nBytes = socket.SendTo(sendbuf, PacketSize, 0, epServer)) == SOCKET_ERROR) 
            

                Console.WriteLine(
"Socket Error cannot Send Packet"); 
                
return "Socket Error cannot Send Packet";
            }
 
            Byte [] ReceiveBuffer 
= new Byte[256]; 
            nBytes 
= 0
            
bool recd =false ; 
            
int timeout=0 ; 

            
while(!recd) 
            

                
try
                
{
                    nBytes 
= socket.ReceiveFrom(ReceiveBuffer, 2560ref EndPointFrom); 
                }

                
catch(Exception ex)
                
{
                    Console.WriteLine(
"Host not Responding") ; 
                    tmp
="Host not Responding";
                    recd
=true ; 
                    
                    
break
                }

                
if (nBytes == SOCKET_ERROR) 
                

                    Console.WriteLine(
"Host not Responding") ; 
                    tmp
="Host not Responding";
                    recd
=true ; 
                    
break
                }
 
                
else if(nBytes>0
                

                    dwStop 
= System.Environment.TickCount - dwStart; 
                    Console.WriteLine(
"Reply from "+epServer.ToString()+" in " 
                        
+dwStop+"MS :Bytes Received"+nBytes); 
                    tmp
="Reply from "+epServer.ToString()+" in " 
                        
+dwStop+"MS :Bytes Received"+nBytes;
                    recd
=true
                    isLink
=true;
                    
break
                }
 
                timeout
=System.Environment.TickCount - dwStart; 
                
if(timeout>1000
                

                    Console.WriteLine(
"Time Out") ; 
                    tmp
="Time Out";
                    recd
=true
                }
 
            }
 

            socket.Close(); 
            
return tmp;
        }
 
        
public static void PingHost(string host) 
        

            IPHostEntry serverHE, fromHE; 
            
int nBytes = 0
            
int dwStart = 0, dwStop = 0
            Socket socket 
= 
                
new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); 

            
try 
            

                serverHE 
= Dns.GetHostByName(host); 
            }
 
            
catch(Exception) 
            

                Console.WriteLine(
"Host not found"); 
                
return ; 
            }
 

            IPEndPoint ipepServer 
= new IPEndPoint(serverHE.AddressList[0], 0); 
            EndPoint epServer 
= (ipepServer); 

            fromHE 
= Dns.GetHostByName(Dns.GetHostName()); 
            IPEndPoint ipEndPointFrom 
= new IPEndPoint(fromHE.AddressList[0], 0); 
            EndPoint EndPointFrom 
= (ipEndPointFrom); 

            
int PacketSize = 0
            IcmpPacket packet 
= new IcmpPacket(); 
            packet.Type 
= ICMP_ECHO; 
            packet.SubCode 
= 0
            packet.CheckSum 
= UInt16.Parse("0"); 
            packet.Identifier 
= UInt16.Parse("45"); 
            packet.SequenceNumber 
= UInt16.Parse("0"); 
            
int PingData = 32
            packet.Data 
= new Byte[PingData]; 
            
for (int i = 0; i < PingData; i++
            

                packet.Data[i] 
= (byte)'#'
            }
 

            PacketSize 
= PingData + 8
            Byte [] icmp_pkt_buffer 
= new Byte[ PacketSize ]; 
            Int32 Index 
= 0
            Index 
= Serialize( 
                packet, 
                icmp_pkt_buffer, 
                PacketSize, 
                PingData ); 
            
if( Index == -1 ) 
            

                Console.WriteLine(
"Error in Making Packet"); 
                
return ; 
            }
 


            Double double_length 
= Convert.ToDouble(Index); 
            Double dtemp 
= Math.Ceiling( double_length / 2); 
            
int cksum_buffer_length = Convert.ToInt32(dtemp); 
            UInt16 [] cksum_buffer 
= new UInt16[cksum_buffer_length]; 
            
int icmp_header_buffer_index = 0
            
forint i = 0; i < cksum_buffer_length; i++ ) 
            

                cksum_buffer[i] 
= 
                    BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index); 
                icmp_header_buffer_index 
+= 2
            }
 
            UInt16 u_cksum 
= checksum(cksum_buffer, cksum_buffer_length); 
            packet.CheckSum 
= u_cksum; 

            Byte [] sendbuf 
= new Byte[ PacketSize ]; 
            Index 
= Serialize( 
                packet, 
                sendbuf, 
                PacketSize, 
                PingData ); 
            
if( Index == -1 ) 
            

                Console.WriteLine(
"Error in Making Packet"); 
                
return ; 
            }
 


            dwStart 
= System.Environment.TickCount; 
            
if ((nBytes = socket.SendTo(sendbuf, PacketSize, 0, epServer)) == SOCKET_ERROR) 
            

                Console.WriteLine(
"Socket Error cannot Send Packet"); 
            }
 
            Byte [] ReceiveBuffer 
= new Byte[256]; 
            nBytes 
= 0
            
bool recd =false ; 
            
int timeout=0 ; 

            
while(!recd) 
            

                nBytes 
= socket.ReceiveFrom(ReceiveBuffer, 2560ref EndPointFrom); 
                
if (nBytes == SOCKET_ERROR) 
                

                    Console.WriteLine(
"Host not Responding") ; 
                    recd
=true ; 
                    
break
                }
 
                
else if(nBytes>0
                

                    dwStop 
= System.Environment.TickCount - dwStart; 
                    Console.WriteLine(
"Reply from "+epServer.ToString()+" in " 
                        
+dwStop+"MS :Bytes Received"+nBytes); 
                    recd
=true
                    
break
                }
 
                timeout
=System.Environment.TickCount - dwStart; 
                
if(timeout>1000
                

                    Console.WriteLine(
"Time Out") ; 
                    recd
=true
                }
 
            }
 

            socket.Close(); 
        }
 
        
public static Int32 Serialize(IcmpPacket packet, Byte[] Buffer, 
            Int32 PacketSize, Int32 PingData ) 
        

            Int32 cbReturn 
= 0
            
int Index=0

            Byte [] b_type 
= new Byte[1]; 
            b_type[
0= (packet.Type); 

            Byte [] b_code 
= new Byte[1]; 
            b_code[
0= (packet.SubCode); 

            Byte [] b_cksum 
= BitConverter.GetBytes(packet.CheckSum); 
            Byte [] b_id 
= BitConverter.GetBytes(packet.Identifier); 
            Byte [] b_seq 
= BitConverter.GetBytes(packet.SequenceNumber); 

            Array.Copy( b_type, 
0, Buffer, Index, b_type.Length ); 
            Index 
+= b_type.Length; 

            Array.Copy( b_code, 
0, Buffer, Index, b_code.Length ); 
            Index 
+= b_code.Length; 

            Array.Copy( b_cksum, 
0, Buffer, Index, b_cksum.Length ); 
            Index 
+= b_cksum.Length; 

            Array.Copy( b_id, 
0, Buffer, Index, b_id.Length ); 
            Index 
+= b_id.Length; 

            Array.Copy( b_seq, 
0, Buffer, Index, b_seq.Length ); 
            Index 
+= b_seq.Length; 

            Array.Copy( packet.Data, 
0, Buffer, Index, PingData ); 
            Index 
+= PingData; 
            
if( Index != PacketSize/* sizeof(IcmpPacket) */
            

                cbReturn 
= -1
                
return cbReturn; 
            }
 

            cbReturn 
= Index; 
            
return cbReturn; 
        }
 
        
public static UInt16 checksum( UInt16[] buffer, int size ) 
        

            Int32 cksum 
= 0
            
int counter; 
            counter 
= 0

            
while ( size > 0 ) 
            

                UInt16 val 
= buffer[counter]; 

                cksum 
+= Convert.ToInt32( buffer[counter] ); 
                counter 
+= 1
                size 
-= 1
            }
 

            cksum 
= (cksum >> 16+ (cksum & 0xffff); 
            cksum 
+= (cksum >> 16); 
            
return (UInt16)(~cksum); 
        }
 
    }
 
    
public class IcmpPacket 
    

        
public Byte Type; 
        
public Byte SubCode; 
        
public UInt16 CheckSum; 
        
public UInt16 Identifier; 
        
public UInt16 SequenceNumber; 
        
public Byte [] Data; 

    }
 
}