求大神把这个icmp寻找活动主机的c#控制台应用程序改成窗体应用程序,需要在窗口上输出结果

问题描述

求大神把这个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的回复:

先建窗口、文本框,然后把值写进去就可以了

怎么写进去,能不能用上面的程序给个说明,或者直接改好发上来,楼主是萌新,不懂
解决方案七:
找本基础书看看。

时间: 2024-09-20 08:17:08

求大神把这个icmp寻找活动主机的c#控制台应用程序改成窗体应用程序,需要在窗口上输出结果的相关文章

求大神指教啊,linux看不出那到底哪里出问题了。。程序死了

问题描述 求大神指教啊,linux看不出那到底哪里出问题了..程序死了 #0 0x47f23c7c in _int_malloc () from /lib/libc.so.6 #1 0x47f25fb7 in malloc () from /lib/libc.so.6 #2 0x48729af7 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6 #3 0x4870513b in std::string::_Rep::_S_

求大神帮助解决:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

问题描述 有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾.**************异常文本**************System.InvalidOperationException:未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"提供程序.在System.Data.OleDb.OleDbServicesWrapper.GetDataSource(OleDbConnectionStringconstr,DataSourceWrapper

作业-大学c++计算级数问题,求大神

问题描述 大学c++计算级数问题,求大神 大学生小白求大神,为什么输出为-1.#ind0000求大神!!!!大学生小白求大神,为什么输出为-1.#ind0000求大神!!!!大学生小白求大神,为什么输出为-1.#ind0000求大神!!!! 解决方案 无限循环了,while条件改成1e8 解决方案二: 计算精度设置错误,有时候还需要考虑收不收敛,对于大数还可能出现溢出错误. 解决方案三: 不好意思,看错了.前面回答的不对,i=i*(i+1) 错了,加个参数,step ,另外,循环依旧结束不了,该

memcached中的server端的lru算法能不能改成lirs算法跪求大神解答

问题描述 memcached中的server端的lru算法能不能改成lirs算法跪求大神解答 memcached中的server端的lru算法能不能改成lirs算法,最近有个任务就是把memcached中lru算法改成lirs 好纠结,本身就对c不熟悉 解决方案 那估计需要你自己修改源码了. 解决方案二: 对 就是改源码 我想知道是大改还是小改 我认为很麻烦,因为item贯穿于memcached的很多地方,但是安排任务的老师认为只需要修改有lru算法那个地方,我很无语 而且让我赶快进入编程阶段,

unity3D 求大神帮忙指点!!!!!!急急急

问题描述 unity3D 求大神帮忙指点!!!!!!急急急 unity场景里有三个cube 在plan上 选中其中一个后:在plan上点哪里选中的cube 就去那里!! 我不会的地方就是 这个选中的部分 !!!和选中后如何连接寻路那个script的地方!!麻烦大神指点!!!!! 解决方案 先用射线找到点到的那个物体 具体代码 RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physi

关于安卓开发环境问题-andriod studio ,bin目录下的studio.bat,找不到这个bat,求大神指点

问题描述 andriod studio ,bin目录下的studio.bat,找不到这个bat,求大神指点 本人虾米一个,安装了studio提示需要运行英特尔加速器HAXM,根据网络上大侠们的回复说需要修改bin目录里的studio.bat,结果怎么都找不到我bat,求大侠指点迷津开发环境问题-andriod studio ,bin目录下的studio.bat,找不到这个bat,求大神指点-找不到studio.bat"> 解决方案 重装一下,或者不用加速器(一样可以),另外可以使用geny

javaweb-通过request获取表单数据,但封装不到对象中,求大神解答!

问题描述 通过request获取表单数据,但封装不到对象中,求大神解答! # User类有username和password两个属性,封装的时候只能封装进去password,输出map的值的时候,里面是有的-- 以下是封装语句: User form = CommonUtils.toBean(request.getParameterMap(),User.class); 以下是CommonUtils类的toBean()方法:(不允许使用尖括号,泛型就用圆括号代替了-) public static (

控件-求大神帮忙写个函数,以控制datagrideview行列变化

问题描述 求大神帮忙写个函数,以控制datagrideview行列变化 2C 我做一个小程序,里面用到了很多数据库和Datagriedview控件,希望写一个全局函数,控制datagridview的行列宽度变化,以及插入和删除行或列(点击鼠标右键时出现插入和删除行列.以及复制粘贴). 在调用数据库后,能不能实现对数据的多行粘贴和复制. 谢谢了,急求. 解决方案 http://bbs.csdn.net/topics/360108393 解决方案二: 设置datagridview行列格式的函数呢?

本人菜鸟一个,在学习严蔚敏版本数据结构的习题时发现一个问题,求大神帮助

问题描述 本人菜鸟一个,在学习严蔚敏版本数据结构的习题时发现一个问题,求大神帮助 大家看标红的部分,为什么不直接写成while(p->next) {p=p->next; i++;} ,是不是为了提高效率? 解决方案 while(p->next) {p=p->next; i++;} 你这种写法,如果P是null呢,p->next就报错了.p是否存在是必须判断的,其他怎么写是另一回事了. 解决方案二: 不可以写成那样,判断p=p->next时,while(p)是判断是否到链