通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>NET专区>>正文 新版上线![旧版]
注:打开慢时请稍等

Asp.net编写的PING工具

http://www.iyit.net  日期:2006-6-12 1:59:18  来源:  点击:
参加讨论】导 读:PING 是一个用来检测网络连接速度的使用工具,下面的文章将介绍在C#中利用System.Net.Sockets 来创建一个自己的PING 工具

--------------------------------------------------------------------------------

PING 是一个用来检测网络连接速度的工具,它会在本机和给出的远程主机名之间建立一个SOCKET 连接并向其发送一个ICMP协议格式的数据包,然后远程主机作出响应,发回一个数据包,通过计算发送到接收数据包的时间间隔,我们可以确定连接的速度。

使用方法 ping <hostname> [/r]

<hostname> 主机名

[/r] 可选属性,决定是否连续的 ping 远程主机。

下面是代码:

///ping.cs

namespace SaurabhPing

{

using System;

using System.Net;

using System.Net.Sockets;

/// <summary>

/// 主要的类:ping

/// </summary>

class Ping

{

//声明几个常量

const int SOCKET_ERROR = -1;

const int ICMP_ECHO = 8;

/// <summary>

/// 这里取得Hostname参数

/// </summary>

public static void Main(string[] argv)

{

if(argv.Length==0)

{

//If user did not enter any Parameter inform him

Console.WriteLine("Usage:Ping <hostname> /r") ;

Console.WriteLine("<hostname> The name of the Host who you want to ping");

Console.WriteLine("/r Ping the host continuously") ;

}

else if(argv.Length==1)

{

//Just the hostname provided by the user

//call the method "PingHost" and pass the HostName as a parameter

PingHost(argv[0]) ;

}

else if(argv.Length==2)

{

//the user provided the hostname and the switch

if(argv=="/r")

{

//loop the ping program

while(true)

{

//call the method "PingHost" and pass the HostName as a parameter

PingHost(argv[0]) ;

}

}

else

{

//if the user provided some other switch

PingHost(argv[0]) ;

}

}

else

{

//Some error occurred

Console.WriteLine("Error in Arguments") ;

}

}

/// <summary>

/// 主要的方法,用来取得IP,

/// 并计算响应时间

/// </summary>

public static void PingHost(string host)

{

//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.AfINet, SocketType.SockRaw, ProtocolType.ProtICMP);

// Get the server endpoint

try

{

serverHE = DNS.GetHostByName(host);

}

catch(Exception)

{

Console.WriteLine("Host not found"); // fail

return ;

}

// 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 Method 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 )

{

Console.WriteLine("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.Ceil( double_length / 2);

int cksum_buffer_length = Convert.ToInt32(dtemp);

//Create a Byte Array

UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];

//Code to initialize 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 )

{

Console.WriteLine("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)

{

Console.WriteLine("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)

{

Console.WriteLine("Host not Responding") ;

recd=true ;

break;

}

else if(nBytes>0)

{

dwStop = System.Environment.TickCount - dwStart; // stop timing

Console.WriteLine("Reply from "+epServer.ToString()+" in "

+dwStop+"MS :Bytes Received"+nBytes);

recd=true;

break;

}

timeout=System.Environment.TickCount - dwStart;

if(timeout>1000)

{

Console.WriteLine("Time Out") ;

recd=true;

}

}

//close the socket

socket.Close();

}

/// <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;

b_type[0] = (packet.Type);

Byte [] b_code = new Byte;

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

}



编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:.NET语言的选择
下一篇:.net的reflection (2)
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
使用 ASP.NET 加密口令 [ASP.NET] Session 详解 从ASP迁移至ASP+
从ASP迁移至ASP+ ----------进入DataSe 从ASP迁移至ASP+ --将HTML表格转换为AS 从ASP迁移至ASP+ --急不可耐了?转换其
从ASP迁移至ASP+ --处理会话变量(Sess ASP+ 与 Java(一) ASP+ 与 Java(二)
asp+的论坛列表程序---代码部分 asp+的论坛列表程序---页面部分 用c#写的asp+域名查询程序
ASP+联结数据库 asp+文件上传增强实例 从ASP迁移至ASP+ --处理会话变量(Sess
ASP.NET学习手记:验证用户表单输入 asp+ 操作Cookie 方法大全 asp+ 现在已经被官方正式更名为 asp.ne
在ASP+ 中我们如何使用 Class 而不是组 asp+ 如何跨站抓取 页面 在 ASp+ 中的一些可能会用到的 小函数
列出asp+中所有request 的属性和数值 妙用asp+的global.asax 一个asp+ 版本的 Active Server Explor
最新更新 热点排行 推荐新闻
使用 ASP.NET 加密口令
[ASP.NET] Session 详解
从ASP迁移至ASP+
从ASP迁移至ASP+ ----------进入DataS
从ASP迁移至ASP+ --将HTML表格转换为A
CGI教程(2)
CGI教程(3)
CGI教程(5)
CGI教程(6)
CGI教程(7)
CGI教程(8)
CGI教程(5)
CGI教学:第一章 cgilib例
CGI教学:第二章 动态创建图像
CGI教学:第三章 计数器的编写方法
为ASP.NET 2.0菜单控件增加target属性
将Asp.net页面输出为HTML
在ASP.NET中防止注入攻击
ASP.NET 2.0 中的异步页功能应用
asp.net面试试题收集
QQ密码本地破解
msn8.0下载
PPLive最新内部版本揭密
珊蝴虫QQ探测隐身的招式用法
Visual Basic 概述
exeplorer.exe错误的问题的总结、解决
Authorware7.0基础与实例教程连载 第5
解决Windows中的explorer.exe出错
Windows常见文件修复技巧
Photoshop打造美女性感纹身(2)
在ASP.NET中防止注入攻击
用ASP.NET开发Web服务的五则技巧
ASP.NET 2.0 中的异步页功能应用
Windows下的虚拟主机设置全功略
危险无处不在 Html标签带来的安全隐患
网络游戏是06年互联网最具发展潜力业务
巧用ACDSee 8.0截取QQ表情每一帧
解除瑞星 诺顿遗留下的杀毒兼容问题
第一款开源AJAX安全扫描工具Sprajax
WinRAR人性化功能揭密
在ASP.NET中防止注入攻击
用ASP.NET开发Web服务的五则技巧
Linux操作系统12则经典应用技巧
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息