| 发表于:2007-01-12 21:41:12 楼主 |
我的图形是这样的:ip是从textbox1中输入,在点击ip按钮,结果在listbox1中输出 这是ip按钮的代码: private void button1_click(object sender, eventargs e) { listbox1.items.clear(); string hostclicent =textbox1.text; int k; for (k = 0; k < 3; k++) { socket socket = new socket(addressfamily.internetwork, sockettype.raw, protocoltype.icmp); iphostentry hostinfo; try { hostinfo = dns.gethostentry(hostclicent); } catch (exception) { listbox1.items.add( "没有发现此主机! "); return; } endpoint hostpoint = (endpoint )new ipendpoint(hostinfo.addresslist[0], 0); iphostentry clientinfo; try { clientinfo = dns.gethostentry(hostclicent); } catch { listbox1.items.add( "没有这样的主机 "); } endpoint clientpoint = (endpoint)new ipendpoint(hostinfo.addresslist[0], 0); int datasize =32; int packetsize = datasize + 8; const int icmp_echo = 8; icmppacket packet = new icmppacket(icmp_echo, 0, 0, 45, 0, datasize); byte[] buffer = new byte[packetsize]; int index = packet.countbyte(buffer); if (index != packetsize) { listbox1.items.add( "报文出现问题! "); return; } int cksum_buffer_length = (int)math.ceiling((double)index) / 2; uint16[] cksum_buffer = new uint16[cksum_buffer_length]; int icmp_header_buffer_index = 0; for (int l = 0; l < cksum_buffer_length; l++) { cksum_buffer[l] = bitconverter.touint16(buffer, icmp_header_buffer_index); icmp_header_buffer_index += 2; } packet.checksum = icmppacket.sumofcheck(cksum_buffer); byte[] senddata = new byte[packetsize]; index = packet.countbyte(senddata); if (index != packetsize) { listbox1.items.add( "报文出现问题! "); return; } int nbytes = 0; int starttime = environment.tickcount; if ((nbytes = socket.sendto(senddata, packetsize, socketflags.none, hostpoint)) == -1) { listbox1.items.add( "无法传送报文! "); } byte[] receivedata = new byte[256]; nbytes = 0; int timeout = 0; int timeconsume = 0; while (true) { nbytes = socket.receivefrom(receivedata, 256, socketflags.none, ref clientpoint); if (nbytes == -1) { listbox1.items.add( "主机没有响应! "); break; } else if (nbytes > 0) { timeconsume = system.environment.tickcount-starttime; listbox1.items.add( "reply from " + hostinfo.addresslist[0].tostring() + "in " + timeconsume + "ms:bytes received " + nbytes); break; } timeout = environment.tickcount - starttime; if (timeout > 1000) { listbox1.items.add( "time out! "); break; } socket.close(); } } 这是icmp协议icmppacket类代码: public class icmppacket { private byte _type; private byte _subcode; private uint16 _checksum; private uint16 _identifier; private uint16 _sequencenumber; private byte[] _data; public icmppacket(byte type, byte subcode, uint16 checksum, uint16 identifier, uint16 sequencenumber, int datasize) { _type = type; _subcode = subcode; _checksum = checksum; _identifier = identifier; _sequencenumber = sequencenumber; _data = new byte[datasize]; for (int i = 0; i < datasize; i++) { _data[i] = (byte) '# '; } } public uint16 checksum { get { return _checksum; } set { _checksum = value; } } public int countbyte(byte[] buffer) { byte[] b_type = new byte[1] { _type }; byte[] b_code = new byte[1] { _subcode }; byte[] b_cksum = bitconverter.getbytes(_checksum); byte[] b_id = bitconverter.getbytes(_identifier); byte[] b_seq = bitconverter.getbytes(_sequencenumber); int i = 0; array.copy(b_type, 0, buffer, i, b_type.length); i += b_type.length; array.copy(b_code, 0, buffer, i, b_code.length); i += b_code.length; array.copy(b_cksum, 0, buffer, i, b_cksum.length); i += b_cksum.length; array.copy(b_id, 0, buffer, i, b_id.length); i += b_id.length; array.copy(b_seq, 0, buffer, i, b_seq.length); i += b_seq.length; array.copy(_data, 0, buffer, i, _data.length); i += _data.length; return i; } public static uint16 sumofcheck(uint16[] buffer) { int cksum = 0; for (int i = 0; i < buffer.length; i++) cksum += (int)buffer[i]; cksum = (cksum > > 16) + (cksum & 0xfff); cksum += (cksum > > 16); return (uint16)(~cksum); } } |
|
|
|
|