[C#] Ping utility die freezed :(

Pagina: 1
Acties:
  • 69 views sinds 30-01-2008

  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Hoi mensen,

Ik probeer de C# Ping utility / class te implementeren in mijn huidige winform programma, nu zit ik met het volgende probleem. Als ik mijn test database met IP addressen laat pingen dan gaat alles goed als de host online is maar wanneer de host offline is dan loopt het programma vast en doet niks meer tot ik hem laat afsluiten...

Hier is de relevante code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
using System;
using System.Net;
using System.Net.Sockets;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace NetSentry
{
    public class Ping
    {
        //Declare some Constant Variables

        const int SOCKET_ERROR = -1;        
        const int ICMP_ECHO = 8;
    
        
        /// <summary>
        ///     This method takes the "hostname" of the server
        ///     and then it ping's it and shows the response time
        /// </summary>
        public void PingHost(string host) // was STATIC
        {
            //Declare the IPHostEntry 
            IPHostEntry serverHE, 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(SocketException e)
            {
            MessageBox.Show("SocketException caught!!!");
            MessageBox.Show("Source : " + e.Source);
            MessageBox.Show("Message : " + e.Message);
            return;
            }
            catch(ArgumentNullException e)
            {
            MessageBox.Show("ArgumentNullException caught!!!");
            MessageBox.Show("Source : " + e.Source);
            MessageBox.Show("Message : " + e.Message);
            return;
            }
            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());
            }
        }
        /// <summary>
        ///  This method get the Packet and calculates the total size 
        ///  of the Pack by converting it to byte array
        /// </summary>
        public static Int32 Serialize(  IcmpPacket packet, Byte [] Buffer, Int32 PacketSize, Int32 PingData )
        {
            Int32 cbReturn = 0;
            // serialize the struct into the array
            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);
            
            // Console.WriteLine("Serialize type ");
            Array.Copy( b_type, 0, Buffer, Index, b_type.Length );
            Index += b_type.Length;
            
            // Console.WriteLine("Serialize code ");
            Array.Copy( b_code, 0, Buffer, Index, b_code.Length );
            Index += b_code.Length;

            // Console.WriteLine("Serialize cksum ");
            Array.Copy( b_cksum, 0, Buffer, Index, b_cksum.Length );
            Index += b_cksum.Length;

            // Console.WriteLine("Serialize id ");
            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;

            // copy the data            
            Array.Copy( packet.Data, 0, Buffer, Index, PingData );
            Index += PingData;
            if( Index != PacketSize/* sizeof(IcmpPacket)  */) {
                cbReturn = -1;
                return cbReturn;
            }

            cbReturn = Index;
            return cbReturn;
        }
        /// <summary>
        ///     This Method has the algorithm to make a checksum 
        /// </summary>
        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);
        }
    } // class ping
    /// <summary>
    ///     Class that holds the Pack information
    /// </summary>
    public class IcmpPacket 
    { 
        public Byte  Type;    // type of message
        public Byte  SubCode;    // type of sub code
        public UInt16 CheckSum;   // ones complement checksum of struct
        public UInt16 Identifier;      // identifier
        public UInt16 SequenceNumber;     // sequence number  
        public Byte [] Data;

    } // class IcmpPacket

}


Volgens mij gaat het hier : serverHE = Dns.GetHostByName(host); al mis want daarna geeft ie bv. al geen messagebos ofzo weer. Is het mogelijk om hier misschien een timeout op te zetten of zit het echte probleem ergens anders?

Alvast bedankt!

- Raenius

http://www.catalogged.net/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uhm ja sorry hoor, maar ga ff zelf debuggen :X

Met 10-20 regels zie ik graag een nieuw topic, maar je maakt mij niet wijs dat je het probleem niet verder kunt isoleren en onderzoeken dan dit.

Zie ook P&W FAQ - De "quickstart".

Professionele website nodig?


Dit topic is gesloten.