问题描述
求大神把这个icmp寻找活动主机的c#控制台应用程序改成窗体应用程序,需要在窗口上输出结果usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceActiveHost{publicclassIcmpPacket{privateByte_type;//类型privateByte_subCode;//代码privateUInt16_checkSum;//校验和privateUInt16_identifier;//识别符privateUInt16_sequenceNumber;//序列号privateByte[]_data;//选项数据publicIcmpPacket(Bytetype,BytesubCode,UInt16checkSum,UInt16identifier,UInt16sequenceNumber,intdataSize){_type=type;_subCode=subCode;_checkSum=checkSum;_identifier=identifier;_sequenceNumber=sequenceNumber;_data=newByte[dataSize];//在数据中,写入指定的数据大小for(inti=0;i<dataSize;i++){//由于选项数据在此命令中并不重要,所以你可以改换任何你喜欢的字符_data[i]=(byte)'#';}}publicUInt16CheckSum{get{return_checkSum;}set{_checkSum=value;}}//初始化ICMP报文publicintCountByte(Byte[]buffer){Byte[]b_type=newByte[1]{_type};Byte[]b_code=newByte[1]{_subCode};Byte[]b_cksum=BitConverter.GetBytes(_checkSum);Byte[]b_id=BitConverter.GetBytes(_identifier);Byte[]b_seq=BitConverter.GetBytes(_sequenceNumber);inti=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;returni;}//将整个ICMP报文信息和数据转化为Byte数据包publicstaticUInt16SumOfCheck(UInt16[]buffer){intcksum=0;for(inti=0;i<buffer.Length;i++)cksum+=(int)buffer[i];cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(UInt16)(~cksum);}}}
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceActiveHost{ classsendhost { staticvoidMain(string[]args) { //分别为要求输入的两个IP地址 Stringaddress1=""; Stringaddress2=""; intcount=0; //活动主机数量 intahost=0; intisAlive=0; //两个IP地址最后一段的数字 intedge1=0; intedge2=255; //IP地址第三个"."之前的部分 Stringfore1=""; Stringfore2=""; if(args.Length==2) { address1=args[0]; address2=args[1]; } else { Console.Write("输入起始IP地址:"); address1=Console.ReadLine(); Console.Write("输入终止IP地址:"); address2=Console.ReadLine(); Console.WriteLine(); } for(inti=1;i<address1.Length;i++) { if(count==3) { edge1=Int16.Parse(address1.Substring(i,address1.Length-i)); fore1=address1.Substring(0,i); count=0; break; } if(address1.Substring(i,1).Equals(".")) { count+=1; } } for(inti=1;i<address2.Length;i++) { if(count==3) { edge2=Int16.Parse(address2.Substring(i,address2.Length-i)); fore2=address2.Substring(0,i); count=0; break; } if(address2.Substring(i,1).Equals(".")) { count+=1; } } //判断两个IP地址是否在同一网段中 if(!fore1.Equals(fore2)) { Console.WriteLine("只能搜索同一网段的主机,请重新输入起始IP和终止IP"); Console.Read(); return; } //两IP之间的主机数量 inttotal=Math.Abs(edge2-edge1+1); //两IP中较小的IP intedge=edge1>edge2?edge2:edge1; Console.WriteLine("网络中活动的主机:"); for(inti=0;i<total;i++) { //计算当前IP inttempedge=edge+i; Stringcurrentaddress=fore1+tempedge; IPAddress[]currentIP=Dns.GetHostAddresses(currentaddress); //分3次侦察,提高准确度 for(intK=0;K<3;K++) { SocketSocket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp); //取服务器端主机的30号端口 //EndPointHostpoint=(EndPoint)newIPEndPoint(Hostinfo.AddressList[0],30); EndPointHostpoint=(EndPoint)newIPEndPoint(currentIP[0],30); //取客户机端主机的30端口 EndPointClientpoint=(EndPoint)newIPEndPoint(currentIP[0],30); //设置icmp报文 intDatasize=4;//Icmp数据包大小; intPacketsize=Datasize+8;//总报文长度 constintIcmp_echo=8; IcmpPacketPacket=newIcmpPacket(Icmp_echo,0,0,45,0,Datasize); Byte[]Buffer=newByte[Packetsize]; intindex=Packet.CountByte(Buffer); //报文出错 if(index!=Packetsize) { Console.WriteLine("报文出错!"); return; } intCksum_buffer_length=(int)Math.Ceiling(((Double)index)/2); UInt16[]Cksum_buffer=newUInt16[Cksum_buffer_length]; intIcmp_header_buffer_index=0; for(intI=0;I<Cksum_buffer_length;I++) { //将两个byte转化为一个uint16 Cksum_buffer[I]=BitConverter.ToUInt16(Buffer,Icmp_header_buffer_index); Icmp_header_buffer_index+=2; } //将校验和保存至报文里 Packet.CheckSum=IcmpPacket.SumOfCheck(Cksum_buffer); //保存校验和后,再次将报文转化为数据包 Byte[]Senddata=newByte[Packetsize]; index=Packet.CountByte(Senddata); //报文出错 if(index!=Packetsize) { Console.WriteLine("报文出错!"); return; } intNbytes=0; //发送数据包 if((Nbytes=Socket.SendTo(Senddata,Packetsize,SocketFlags.None,Hostpoint))==-1) { Console.WriteLine("无法传送报文!"); } Byte[]Receivedata=newByte[256];//接收数据 Nbytes=0; while(true) { try { //设置接收超时时间 Socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,1000); Nbytes=Socket.ReceiveFrom(Receivedata,256,SocketFlags.None,refClientpoint); if(Nbytes==-1) { isAlive=1; Console.WriteLine("主机没有响应!"); break; } elseif(Nbytes>0) { isAlive=0; break; } }catch(Exception) { //Console.WriteLine("timeout"); isAlive=1; break; } } //关闭套接字 Socket.Close(); } if(isAlive==0) { Console.WriteLine(currentIP[0].ToString()); ahost+=1; } } Console.Write("nIP地址段"+address1+"与"+address2+"之间共有"+total+"台主机."); Console.WriteLine("其中活动的主机有"+ahost+"台."); Console.ReadLine(); } }}
解决方案
解决方案二:
只要把Console.ReadLine和WriteLine改写成从文本框读取,别的照搬就可以了。
解决方案三:
引用1楼caozhy的回复:
只要把Console.ReadLine和WriteLine改写成从文本框读取,别的照搬就可以了。
可以具体一点么?我才接触c#,Console.ReadLine和WriteLine改写的具体代码是什么?
解决方案四:
引用1楼caozhy的回复:
只要把Console.ReadLine和WriteLine改写成从文本框读取,别的照搬就可以了。
而且,改为窗体应用不用重新编辑窗体文件么?输出的窗体都不编辑输出结果放在哪啊?
解决方案五:
先建窗口、文本框,然后把值写进去就可以了
解决方案六:
引用4楼lshfong的回复:
先建窗口、文本框,然后把值写进去就可以了
怎么写进去,能不能用上面的程序给个说明,或者直接改好发上来,楼主是萌新,不懂
解决方案七:
找本基础书看看。