Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Ping Utility freezing up...?

Status
Not open for further replies.

Raenius

Programmer
Oct 14, 2003
77
0
0
NL
Hi all,

I am working on incorporating the C# ping Utility from into my own winform program.

I had to adjust some things (variables etc) for it to work but never mind that. I am currently calling the function with IP addresses I get out of my Database, this all goes well with no problems.

When I call the function and the host is up I get the ping back and the reply time perfectly BUT when the host is down, the program freezes and stops working until I force it to close...

Here is the code:
Code:
public void PingHost(string host) // was STATIC
		{
			//Declare the IPHostEntry 
	        IPHostEntry serverHE=null, fromHE;
	        int nBytes = 0;
	        int dwStart = 0, dwStop = 0;
			//Initilize a Socket of the Type ICMP
			Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

	        // Get the server endpoint
			try
			{
				serverHE = Dns.GetHostByName(host);
			}
			catch(Exception m)
			{
				MessageBox.Show("Host not found");
				MessageBox.Show(m.ToString(),"Error Message");
				return;
			}

			try
			{
			// Convert the server IP_EndPoint to an EndPoint
            IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0);
			EndPoint epServer = (ipepServer);

			// Set the receiving endpoint to the client machine
			fromHE = Dns.GetHostByName(Dns.GetHostName());
	        IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0);        
	        EndPoint EndPointFrom = (ipEndPointFrom);

	        int PacketSize = 0;
			IcmpPacket packet = new IcmpPacket();
	        // Construct the packet to send
	        packet.Type = ICMP_ECHO; //8
	        packet.SubCode = 0;
	        packet.CheckSum = UInt16.Parse("0");
	        packet.Identifier   = UInt16.Parse("45"); 
	        packet.SequenceNumber  = UInt16.Parse("0"); 
			int PingData = 32; // sizeof(IcmpPacket) - 8;
	        packet.Data = new Byte[PingData];
			//Initilize the Packet.Data
	        for (int i = 0; i < PingData; i++)
			{
				packet.Data[i] = (byte)'#';
			}
	             
			//Variable to hold the total Packet size
	        PacketSize = PingData + 8;
	        Byte [] icmp_pkt_buffer = new Byte[ PacketSize ]; 
	        Int32 Index = 0;
			//Call a Methos Serialize which counts
			//The total number of Bytes in the Packet
	        Index = Serialize(  
	                      packet, 
	                      icmp_pkt_buffer, 
	                      PacketSize, 
	                      PingData );
			//Error in Packet Size
	        if( Index == -1 )
			{
				MessageBox.Show("Error in Making Packet");
				return ;
			}
          
	            // now get this critter into a UInt16 array
	         
	            //Get the Half size of the Packet
	            Double double_length = Convert.ToDouble(Index);
				Double dtemp = Math.Ceiling( double_length / 2);  
				int cksum_buffer_length = Convert.ToInt32(dtemp);
				//Create a Byte Array
	            UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];
				//Code to initilize the Uint16 array 
	            int icmp_header_buffer_index = 0;
	            for( int i = 0; i < cksum_buffer_length; i++ ) {
					cksum_buffer[i] = 
	                   BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index);
	                icmp_header_buffer_index += 2;
	            }
				//Call a method which will return a checksum             
	            UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length);
				//Save the checksum to the Packet
	            packet.CheckSum  = u_cksum; 
	            
	            // Now that we have the checksum, serialize the packet again
	            Byte [] sendbuf = new Byte[ PacketSize ]; 
	            //again check the packet size
	            Index = Serialize(  
	                        packet, 
	                        sendbuf, 
	                        PacketSize, 
	                        PingData );
				//if there is a error report it
	            if( Index == -1 )
				{
					MessageBox.Show("Error in Making Packet");
					return ;
				}
	                

	            dwStart = System.Environment.TickCount; // Start timing
				//send the Pack over the socket
	            if ((nBytes = socket.SendTo(sendbuf, PacketSize, 0, epServer)) == SOCKET_ERROR) 
				{		
	                MessageBox.Show("Socket Error cannot Send Packet");
	            }
				// Initialize the buffers. The receive buffer is the size of the
	            // ICMP header plus the IP header (20 bytes)
	            Byte [] ReceiveBuffer = new Byte[256]; 
	            nBytes = 0;
				//Receive the bytes
	            bool recd =false ;
				int timeout=0 ;
 
				//loop for checking the time of the server responding 
				while(!recd)
				{
					nBytes = socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom);
					if (nBytes == SOCKET_ERROR) 
					{
						MessageBox.Show("Host not Responding") ;
						recd=true ;
						break;
					}
					else if(nBytes>0)
					{
						dwStop = System.Environment.TickCount - dwStart; // stop timing
						MessageBox.Show("Reply from "+epServer.ToString()+" in "+dwStop+"MS :Bytes Received"+nBytes);
						recd=true;
						break;
					}
					timeout=System.Environment.TickCount - dwStart;
					if(timeout>1000)
					{
						MessageBox.Show("Time Out") ;
						recd=true;
					}
					
				}
	            
			//close the socket
			socket.Close();
			}
			catch(Exception n)
			{
			MessageBox.Show(n.ToString());
			}
		}

Does anyone have an idea what is going on? I thought it was the:
Code:
 IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0);
part which can't be done if the host is down, I put in into a big try/catch situation but no errors are reported the entire program just freezes.

I hope someone can help me.

Kind regards,

Raenius





&quot;Free will...is an illusion&quot;
 
I think I have localised the error to indeed the:
Code:
serverHE = Dns.GetHostByName(host);
and after that the:
Code:
IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0);
EndPoint epServer = (ipepServer);

Weird thing is that it does not give any exceptions! :'(

I hope that someone can help me...

- Raenius 



&quot;Free will...is an illusion&quot;
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top