Ping服务器

问题描述

怎么写c#代码实现是否ping通的服务器谢啦兄弟

解决方案

解决方案二:
publicboolcheckConn(){try{System.Net.IPHostEntryip;System.Net.IPAddressaddress;address=System.Net.IPAddress.Parse("202.103.24.68");ip=System.Net.Dns.GetHostByAddress(address);returntrue;}catch(Exception){returnfalse;}}IP你自己写通了就是true
解决方案三:
//声明常量constintSOCKET_ERROR=-1;constintICMP_ECHO=8;publicstaticInt32Serialize(IcmpPacketpacket,Byte[]Buffer,Int32PacketSize,Int32PingData){//取得报文内容,转化为字节数组,然后计算报文的长度Int32cbReturn=0;//数据报结构转化为数组intIndex=0;Byte[]b_type=newByte[1];b_type[0]=(packet.Type);Byte[]b_code=newByte[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);Array.Copy(b_type,0,Buffer,Index,b_type.Length);Index+=b_type.Length;Array.Copy(b_code,0,Buffer,Index,b_code.Length);Index+=b_code.Length;Array.Copy(b_cksum,0,Buffer,Index,b_cksum.Length);Index+=b_cksum.Length;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;//复制数据Array.Copy(packet.Data,0,Buffer,Index,PingData);Index+=PingData;if(Index!=PacketSize/*sizeof(IcmpPacket)*/){cbReturn=-1;returncbReturn;}cbReturn=Index;returncbReturn;}///<summary>///校验和算法///</summary>publicstaticUInt16checksum(UInt16[]buffer,intsize){Int32cksum=0;intcounter;counter=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/while(size>0){UInt16val=buffer[counter];cksum+=Convert.ToInt32(buffer[counter]);counter+=1;size-=1;}/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个*2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(UInt16)(~cksum);}privatevoidbutton1_Click(objectsender,System.EventArgse){//执行PINGthis.richTextBox1.Text="";for(intp=0;p<10;p++){try{stringHostName=this.textBox1.Text;intnBytes=0;intdwStart=0,dwStop=0;//初始化一个ICMP类型的SocketSocketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);//取得目标主机的主机名IPHostEntryserverHE=Dns.GetHostByName(HostName);IPEndPointipepServer=newIPEndPoint(serverHE.AddressList[0],0);EndPointepServer=(ipepServer);IPHostEntryfromHE=Dns.GetHostByName(Dns.GetHostName());IPEndPointipEndPointFrom=newIPEndPoint(fromHE.AddressList[0],0);EndPointEndPointFrom=(ipEndPointFrom);intPacketSize=0;IcmpPacketpacket=newIcmpPacket();//构造数据报packet.Type=ICMP_ECHO;packet.SubCode=0;packet.CheckSum=UInt16.Parse("0");packet.Identifier=UInt16.Parse("45");packet.SequenceNumber=UInt16.Parse("0");intPingData=32;//sizeof(IcmpPacket)-8;packet.Data=newByte[PingData];//初始化Packet.Datafor(inti=0;i<PingData;i++){packet.Data[i]=(byte)'#';}//保存数据报的长度PacketSize=PingData+8;Byte[]icmp_pkt_buffer=newByte[PacketSize];Int32Index=0;//调用Serialize方法//报文总共的字节数Index=Serialize(packet,icmp_pkt_buffer,PacketSize,PingData);if(Index==-1){this.richTextBox1.Text+="报文大小有错!n";return;}//转化为Uint16类型的数组,取得数据报长度的一半Doubledouble_length=Convert.ToDouble(Index);Doubledtemp=Math.Ceiling(double_length/2);intcksum_buffer_length=Convert.ToInt32(dtemp);//生成一个字节数组UInt16[]cksum_buffer=newUInt16[cksum_buffer_length];//初始化Uint16类型arrayinticmp_header_buffer_index=0;for(inti=0;i<cksum_buffer_length;i++){cksum_buffer[i]=BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index);icmp_header_buffer_index+=2;}//调用checksum,返回检查和UInt16u_cksum=checksum(cksum_buffer,cksum_buffer_length);//检查和存在报文中packet.CheckSum=u_cksum;Byte[]sendbuf=newByte[PacketSize];//再次检查报文大小Index=Serialize(packet,sendbuf,PacketSize,PingData);//如果有错,则报告错误if(Index==-1){this.richTextBox1.Text+="报文大小有错!n";return;}dwStart=System.Environment.TickCount;//开始时间//用socket发送数据报if((nBytes=socket.SendTo(sendbuf,PacketSize,0,epServer))==SOCKET_ERROR){this.richTextBox1.Text+="不能发送数据包!n";}//初始化缓冲区.接受缓冲区//ICMP头+IP头(20字节)Byte[]ReceiveBuffer=newByte[256];nBytes=0;//接受字节流boolrecd=false;inttimeout=0;//循环检查目标主机响应时间while(!recd){nBytes=socket.ReceiveFrom(ReceiveBuffer,256,0,refEndPointFrom);if(nBytes==SOCKET_ERROR){this.richTextBox1.Text+="目标主机没有响应!n";recd=true;break;}elseif(nBytes>0){dwStop=System.Environment.TickCount-dwStart;this.richTextBox1.Text+="数据来自主机:"+this.textBox1.Text+",收到的字节数:"+nBytes+",耗时:"+dwStop+"msn";recd=true;break;}timeout=System.Environment.TickCount-dwStart;if(timeout>1000){this.richTextBox1.Text+="连接超时!n";recd=true;}}//关闭socketsocket.Close();}catch(ExceptionErr){MessageBox.Show("PING目标主机操作失败!错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}}}}publicclassIcmpPacket{publicByteType;//消息类型publicByteSubCode;//子码类型publicUInt16CheckSum;//校检和publicUInt16Identifier;//标志符publicUInt16SequenceNumber;//顺序号publicByte[]Data;//数据}//ICMP包}

仅供参考!
解决方案四:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;usingSystem.Net.NetworkInformation;namespaceRemoteStationProgram{classPingServer{publicstaticboolping(stringServerIP){PingpingSender=newPing();PingOptionsoptions=newPingOptions();options.DontFragment=true;stringdata="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";byte[]buffer=Encoding.ASCII.GetBytes(data);inttimeout=120;PingReplyreply=pingSender.Send(ServerIP,timeout,buffer,options);return(reply.Status==IPStatus.Success);}}}

解决方案五:
//声明常量constintSOCKET_ERROR=-1;constintICMP_ECHO=8;publicstaticInt32Serialize(IcmpPacketpacket,Byte[]Buffer,Int32PacketSize,Int32PingData){//取得报文内容,转化为字节数组,然后计算报文的长度Int32cbReturn=0;//数据报结构转化为数组intIndex=0;Byte[]b_type=newByte[1];b_type[0]=(packet.Type);Byte[]b_code=newByte[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);Array.Copy(b_type,0,Buffer,Index,b_type.Length);Index+=b_type.Length;Array.Copy(b_code,0,Buffer,Index,b_code.Length);Index+=b_code.Length;Array.Copy(b_cksum,0,Buffer,Index,b_cksum.Length);Index+=b_cksum.Length;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;//复制数据Array.Copy(packet.Data,0,Buffer,Index,PingData);Index+=PingData;if(Index!=PacketSize/*sizeof(IcmpPacket)*/){cbReturn=-1;returncbReturn;}cbReturn=Index;returncbReturn;}///<summary>///校验和算法///</summary>publicstaticUInt16checksum(UInt16[]buffer,intsize){Int32cksum=0;intcounter;counter=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/while(size>0){UInt16val=buffer[counter];cksum+=Convert.ToInt32(buffer[counter]);counter+=1;size-=1;}/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个*2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(UInt16)(~cksum);}privatevoidbutton1_Click(objectsender,System.EventArgse){//执行PINGthis.richTextBox1.Text="";for(intp=0;p<10;p++){try{stringHostName=this.textBox1.Text;intnBytes=0;intdwStart=0,dwStop=0;//初始化一个ICMP类型的SocketSocketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);//取得目标主机的主机名IPHostEntryserverHE=Dns.GetHostByName(HostName);IPEndPointipepServer=newIPEndPoint(serverHE.AddressList[0],0);EndPointepServer=(ipepServer);IPHostEntryfromHE=Dns.GetHostByName(Dns.GetHostName());IPEndPointipEndPointFrom=newIPEndPoint(fromHE.AddressList[0],0);EndPointEndPointFrom=(ipEndPointFrom);intPacketSize=0;IcmpPacketpacket=newIcmpPacket();//构造数据报packet.Type=ICMP_ECHO;packet.SubCode=0;packet.CheckSum=UInt16.Parse("0");packet.Identifier=UInt16.Parse("45");packet.SequenceNumber=UInt16.Parse("0");intPingData=32;//sizeof(IcmpPacket)-8;packet.Data=newByte[PingData];//初始化Packet.Datafor(inti=0;i<PingData;i++){packet.Data[i]=(byte)'#';}//保存数据报的长度PacketSize=PingData+8;Byte[]icmp_pkt_buffer=newByte[PacketSize];Int32Index=0;//调用Serialize方法//报文总共的字节数Index=Serialize(packet,icmp_pkt_buffer,PacketSize,PingData);if(Index==-1){this.richTextBox1.Text+="报文大小有错!n";return;}//转化为Uint16类型的数组,取得数据报长度的一半Doubledouble_length=Convert.ToDouble(Index);Doubledtemp=Math.Ceiling(double_length/2);intcksum_buffer_length=Convert.ToInt32(dtemp);//生成一个字节数组UInt16[]cksum_buffer=newUInt16[cksum_buffer_length];//初始化Uint16类型arrayinticmp_header_buffer_index=0;for(inti=0;i<cksum_buffer_length;i++){cksum_buffer[i]=BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index);icmp_header_buffer_index+=2;}//调用checksum,返回检查和UInt16u_cksum=checksum(cksum_buffer,cksum_buffer_length);//检查和存在报文中packet.CheckSum=u_cksum;Byte[]sendbuf=newByte[PacketSize];//再次检查报文大小Index=Serialize(packet,sendbuf,PacketSize,PingData);//如果有错,则报告错误if(Index==-1){this.richTextBox1.Text+="报文大小有错!n";return;}dwStart=System.Environment.TickCount;//开始时间//用socket发送数据报if((nBytes=socket.SendTo(sendbuf,PacketSize,0,epServer))==SOCKET_ERROR){this.richTextBox1.Text+="不能发送数据包!n";}//初始化缓冲区.接受缓冲区//ICMP头+IP头(20字节)Byte[]ReceiveBuffer=newByte[256];nBytes=0;//接受字节流boolrecd=false;inttimeout=0;//循环检查目标主机响应时间while(!recd){nBytes=socket.ReceiveFrom(ReceiveBuffer,256,0,refEndPointFrom);if(nBytes==SOCKET_ERROR){this.richTextBox1.Text+="目标主机没有响应!n";recd=true;break;}elseif(nBytes>0){dwStop=System.Environment.TickCount-dwStart;this.richTextBox1.Text+="数据来自主机:"+this.textBox1.Text+",收到的字节数:"+nBytes+",耗时:"+dwStop+"msn";recd=true;break;}timeout=System.Environment.TickCount-dwStart;if(timeout>1000){this.richTextBox1.Text+="连接超时!n";recd=true;}}//关闭socketsocket.Close();}catch(ExceptionErr){MessageBox.Show("PING目标主机操作失败!错误信息是:"+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}}}}publicclassIcmpPacket{publicByteType;//消息类型publicByteSubCode;//子码类型publicUInt16CheckSum;//校检和publicUInt16Identifier;//标志符publicUInt16SequenceNumber;//顺序号publicByte[]Data;//数据}//ICMP包}

仅供参考!

时间: 2024-10-10 06:30:05

Ping服务器的相关文章

iOS ping服务器是否连通

问题描述 iOS ping服务器是否连通 在模拟器上 netinet/ip_icmp.h netinet/udp.h 这个两个api可是使用,但在真机上不能使用,无法识别,怎么办呢 ? 解决方案 重新启动再试一次,以前我也是这样的 解决方案二: 不可以的哦 求解啊 解决方案三:

我在服务器上部署了一个监控,结果服务器都关了,监控还是显示正常,测试ping服务器还是通的

问题描述 我在服务器上部署了一个监控,结果服务器都关了,监控还是显示正常,测试ping服务器还是通的 我在服务器上部署了一个监控,结果服务器都关了,监控还是显示正常,测试ping服务器还是通的 解决方案 ip有重复吧,实际ping的是另外一台机器. 是不是有相同设置的备用机? 解决方案二: 是不是服务器外有防火墙,ping的是防火墙的转换地址呢 解决方案三: 你ping的是网关ip么>你的监控是实时的吗 解决方案四: 最好的监控是否alive还是自己在应用层发送和接受心跳来判断 解决方案五: 我

长时间ping-长时间Ping服务器的地址会时不时的出现请求未响应是什么原因?

问题描述 长时间Ping服务器的地址会时不时的出现请求未响应是什么原因? 长时间Ping服务器的地址会时不时的出现请求未响应是什么原因? 解决方案 网络不通,丢频,请检查线路,或网络. 解决方案二: 服务器不高兴了,Y的老调戏我,不理他.哈,原因很多了,我是对楼上补充.

服务器怎么禁止被Ping?

  频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进行设置,也可以在路由器上进行设置,并且还可以利用Windows 2000/2003系统自身的功能实现.无论采用哪种方式,都是通过禁止使用ICMP协议来实现拒绝Ping动作.以在Windows Server 2003中设置IP策略拒绝用户Ping服务器为例,具体操作步骤如下: 1.添加IP筛选器 第1步,依次单击"开始/管理工具/本地安全策略"

服务器禁止被ping的设置方法(图文)_win服务器

频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进行设置,也可以在路由器上进行设置,并且还可以利用Windows 2000/2003系统自身的功能实现.无论采用哪种方式,都是通过禁止使用ICMP协议来实现拒绝Ping动作. 以在Windows Server 2003中设置IP策略拒绝用户Ping服务器为例,具体操作步骤如下:1.添加IP筛选器第1步,依次单击"开始/管理工具/本地安全策略",打

远程连接sql server 2000服务器的解决方案

server|服务器|解决 远程连接sql server 2000服务器的解决方案 一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务器的IP拼写正确. 二 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通. 如telnet 202.114.100.100 1433 通常端口值是1433,因为1433是sql server 2000

远程连接SQL Server 2000服务器的方法

需求如下:需要远程连接外地的SQL Server 2000服务器. 测试条件:一个公网IP,两个静态IP. 具体步骤: 一.ping服务器IP能否ping通 观察远程SQL Server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务器的IP拼写正确. 二.在Dos或命令行下输入telnet 服务器IP 端口,看能否连通 如telnet 202.114.100.100 1433 通常端口值是1433,因为1433是SQL Ser

IOS Reachability判断所请求服务器是否超时

开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息.如果没有处理它们,是不会通过Apple的审查的. Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法. 1.在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中. 2.然后将 SystemConfiguration.framework 添加进工程. 我使用的版本为 : Version: 2.2 我为Apple的例

远程连接sql server服务器的方法

如果需要远程连接sql server 服务器,应该用什么方法呢?下面就将教您远程连接sql server服务器的解决方案,供您参考. 一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务器的IP拼写正确. 二 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通. 如telnet 202.114.100.100 1433 通常端口值是14