文章作者 100test 发表时间 2007:03:13 21:44:54
来源 100Test.Com百考试题网
编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习有所帮助!!
/* 本程序的主要源代码来自MSDN网站, 笔者只是做了一些改进和注释! 另外需要注意的是在Build之前,必须加入ws2_32.lib库文件,否则会提示"error LNK2001:"的错误!*/
/**************************************************************************\
| Version 1.1 修改记录: |
| <1> 解决了socket阻塞的问题,从而能够正确地处理超时的请求! |
|--------------------------------------------------------------------|
| Version 1.2 修改记录: |
| <1> 增加了由用户控制发送ICMP包的数目的功能(即命令的第二个参数). |
| <2> 增加了对ping结果的统计功能. |
\***************************************************************************/
#pragma pack(4)
#i nclude
#i nclude
#i nclude
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)
/* The IP header */
typedef struct iphdr {
unsigned int h_len:4. // length of the header
unsigned int version:4. // Version of IP
unsigned char tos. // Type of service
unsigned short total_len. // total length of the packet
unsigned short ident. // unique identifier
unsigned short frag_and_flags. // flags
unsigned char ttl.
unsigned char proto. // protocol (TCP, UDP etc)
unsigned short checksum. // IP checksum
unsigned int sourceIP.
unsigned int destIP.
}IpHeader.
//
// ICMP header
//
typedef struct icmphdr {
BYTE i_type.
BYTE i_code. /* type sub code */
USHORT i_cksum.
USHORT i_id.
USHORT i_seq.
/* This is not the std header, but we reserve space for time */
ULONG timestamp.
}IcmpHeader.
#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE 32
#define DEF_PACKET_NUMBER 4 /* 发送数据报的个数 */
#define MAX_PACKET 1024
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree (GetProcessHeap(),0,(p))
void fill_icmp_data(char *, int).
USHORT checksum(USHORT *, int).
int decode_resp(char *,int ,struct sockaddr_in *).
void Usage(char *progname){
fprintf(stderr,"Usage:\n").
fprintf(stderr,"%s [number of packets] [data_size]\n",progname).
fprintf(stderr,"datasize can be up to 1Kb\n").
ExitProcess(STATUS_FAILED).
}
int main(int argc, char **argv){
WSADATA wsaData.
SOCKET sockRaw.
struct sockaddr_in dest,from.
struct hostent * hp.
int bread,datasize,times.
int fromlen = sizeof(from).
int timeout = 1000.
int statistic = 0. /* 用于统计结果 */
char *dest_ip.
char *icmp_data.
char *recvbuf.
unsigned int addr=0.
USHORT seq_no = 0.
if (WSAStartup(MAKEWORD(2,1),&.wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()).
ExitProcess(STATUS_FAILED).
}
if (argc <2 ) {
Usage(argv[0]).
}
sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED).
//
//注:为了使用发送接收超时设置(即设置SO_RCVTIMEO, SO_SNDTIMEO),
// 必须将标志位设为WSA_FLAG_OVERLAPPED !
//
if (sockRaw == INVALID_SOCKET) {
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError()).
ExitProcess(STATUS_FAILED).
}
bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&.timeout,
sizeof(timeout)).
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError()).
ExitProcess(STATUS_FAILED).
}
timeout = 1000.
bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&.timeout,
sizeof(timeout)).
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError()).
ExitProcess(STATUS_FAILED).
}
memset(&.dest,0,sizeof(dest)).
hp = gethostbyname(argv[1]).
if (!hp){
addr = inet_addr(argv[1]).
}
if ((!hp) &.&. (addr == INADDR_NONE) ) {
fprintf(stderr,"Unable to resolve %s\n",argv[1]).
ExitProcess(STATUS_FAILED).
}
if (hp != NULL)
memcpy(&.(dest.sin_addr),hp->h_addr,hp->h_length).
else
dest.sin_addr.s_addr = addr.
if (hp)
dest.sin_family = hp->h_addrtype.
else
dest.sin_family = AF_INET.
dest_ip = inet_ntoa(dest.sin_addr).
//
// atoi函数原型是: int atoi( const char *string ).
// The return value is 0 if the input cannot be converted to an integer !
//
if(argc>2)
{
times=atoi(argv[2]).
if(times == 0)
times=DEF_PACKET_NUMBER.
}
else
times=DEF_PACKET_NUMBER.
相关文章
微软ping程序源代码完整版(下)
Microsoft应用软件开发者认证MCAD
微软ping程序源代码完整版(上)
MCTS认证.NET框架2.0Web应用程序
Win2000_XP系统输入法丢失解决方法
Win2003系统中搭建视频服务器
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛