loveamanda
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
English
(rss)
J2SE
(rss)
文章分类
.net平台
(rss)
C#(3)
(rss)
English
(rss)
J2EE
(rss)
j2me
(rss)
java平台
(rss)
Python
(rss)
工控(1)
(rss)
开发工具
(rss)
开源
(rss)
数据库
(rss)
算法
(rss)
设计模式
(rss)
随笔档案
2008年9月 (3)
2008年8月 (1)
文章档案
2008年9月 (2)
2008年8月 (2)
相册
个人相册
阅读排行榜
1. jdk和jre 的区别(472)
2. 闭门造车就是在毁灭自己(182)
3. head first 拿到手了,正在啃(166)
4. 不要迷失在技术的海洋里(117)
评论排行榜
1. 闭门造车就是在毁灭自己(2)
2. 不要迷失在技术的海洋里(0)
3. head first 拿到手了,正在啃(0)
4. jdk和jre 的区别(0)
常用链接
我的随笔
我的评论
我的参与
最新评论
统计
随笔 - 4
文章 - 4
评论 - 2
引用 - 0
最新评论
1. re: 闭门造车就是在毁灭自己
8年, 有什么理由能让你如此眷恋呢?
--CPL
2. re: 闭门造车就是在毁灭自己
我们公司和你的情况几乎一样,就是绝不拖欠工资。
工作了8年,我的技术已经荒芜了。
--sLy
一段国外的PING程序(C#)
引自 http:
//
www.xayesky.com/dev/2008/0525/article_8537.html
//
**************************************
//
//
Name: Ping .net Class!
//
Description:Ping a machine from .NET.
//
This code is CLR compliant.
//
By: Carl Mercier
//
//
Assumes:The code is a complete consol
//
e application which can easilly modified
//
to become Windows Form.
//
//
This code is copyrighted and has
//
limited warranties.Please see http:
//
//
www.Planet-Source-Code.com/xq/ASP/txtCod
//
eId.335/lngWId.10/qx/VB/scripts/ShowCode
//
.htm
//
for details.
//
**************************************
//
using
System;
namespace
myping
{
/**/
///
<summary>
///
Summary description for Class1.
///
</summary>
class
myping
{
/**/
///
<summary>
///
The main entry point for the applica
//
tion.
/**/
///
</summary>
//
Declare some Constant Variables
const
int
SOCKET_ERROR
=
-
1
;
const
int
ICMP_ECHO
=
8
;
[STAThread]
static
void
Main(
string
[] args)
{
//
//
TODO: Add code to start application h
//
ere
//
if
(args.Length
==
0
)
{
//
If user did not enter any Parameter in
//
form him
Console.WriteLine(
"
Usage:myping <hostname> /r
"
) ;
Console.WriteLine(
"
<hostname> The name of the Host who you want to ping
"
);
Console.WriteLine(
"
/r Optional Switch to Ping the host continuously
"
) ;
}
else
if
(args.Length
==
1
)
{
//
Just the hostname provided by the user
//
//
call the method "PingHost" and pass th
//
e HostName as a parameter
PingHost(args[
0
]) ;
}
else
if
(args.Length
==
2
)
{
//
the user provided the hostname and the
//
switch
if
(args[
1
]
==
"
/r
"
)
{
//
loop the ping program
while
(
true
)
{
//
call the method "PingHost" and pass th
//
e HostName as a parameter
PingHost(args[
0
]) ;
}
}
else
{
//
if the user provided some other switch
//
PingHost(args[
0
]) ;
}
}
else
{
//
Some error occured
Console.WriteLine(
"
Error in Arguments
"
) ;
}
}
public
static
void
PingHost(
string
host)
{
//
Declare the IPHostEntry
System.Net.IPHostEntry serverHE, fromHE;
int
nBytes
=
0
;
int
dwStart
=
0
, dwStop
=
0
;
//
Initilize a Socket of the Type ICMP
System.Net.Sockets.Socket socket
=
new
System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.Icmp);
//
Get the server endpoint
try
{
serverHE
=
System.Net.Dns.GetHostByName(host);
}
catch
(Exception)
{
Console.WriteLine(
"
Host not found
"
);
//
fail
return
;
}
//
Convert the server IP_EndPoint to an
//
EndPoint
System.Net.IPEndPoint ipepServer
=
new
System.Net.IPEndPoint(serverHE.AddressList[
0
],
0
);
System.Net.EndPoint epServer
=
(ipepServer);
//
Set the receiving endpoint to the cli
//
ent machine
fromHE
=
System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName());
System.Net.IPEndPoint ipEndPointFrom
=
new
System.Net.IPEndPoint(fromHE.AddressList[
0
],
0
);
System.Net.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 Methos Serialize which counts
//
The total number of Bytes in the Packe
//
t
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 ar
//
ray
//
Get the Half size of the Packet
Double double_length
=
Convert.ToDouble(Index);
Double dtemp
=
System.Math.Ceiling( double_length
/
2
);
int
cksum_buffer_length
=
Convert.ToInt32(dtemp);
//
Create a Byte Array
UInt16 [] cksum_buffer
=
new
UInt16[cksum_buffer_length];
//
Code to initilize 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 chec
//
ksum
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, serial
//
ize 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 b
//
uffer is the size of the
//
ICMP header plus the IP header (20 by
//
tes)
Byte [] ReceiveBuffer
=
new
Byte[
256
];
nBytes
=
0
;
//
Receive the bytes
bool
recd
=
false
;
int
timeout
=
0
;
//
loop for checking the time of the serv
//
er 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();
}
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[
1
];
b_type[
0
]
=
(packet.Type);
Byte [] b_code
=
new
Byte[
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);
//
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;
}
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);
}
}
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;
}
}
posted on 2008-09-01 22:18
皮皮陈
阅读(116)
评论(0)
编辑
收藏
所属分类:
C#
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
相关文章:
小小String: 别说我不起眼
一段国外的PING程序(C#)
GDI+里如何实现图形的整体旋转、移动
Powered by:
BlogJava
Copyright © 皮皮陈