微软ping程序源代码完整版(上)

文章作者 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系统中搭建视频服务器
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛