| 网站首页 | 考研信息中心 | 考研资料下载 | 考研论坛 | 考研专业试题 | 2008考研招生简章 | 考研图书 | 留言板 | 考研图片中心 | 

设为首页
加入收藏
联系我们

您现在的位置: 考研信息网 >> 考研信息中心 >> 计算机类考试首页 >> 微软认证 >> 最新资讯 >> 正文 用户登录 新用户注册
微软ping程序源代码完整版(上)(1)          【字体:
微软ping程序源代码完整版(上)(1)
作者:佚名    文章来源:不详    点击数:    更新时间:2006-11-10

本站推荐Firefox浏览器,有效阻止病毒和垃圾弹出[正版免费下载]

 编写自己的一个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: "); 
fprintf(stderr,"%s [number of packets] [data_size] ",progname); 
fprintf(stderr,"datasize can be up to 1Kb "); 
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; 
  共2页: 1 [2] 下一页   


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 ",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 ",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 ",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 ",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 ",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; 
  共2页: 上一页 [1] 2      


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 ",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 ",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 ",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 ",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 ",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 c

[1] [2] 下一页

考研信息网在线版权与免责声明

1、 凡本站注明“稿件来源:考研信息网(sanwww.com)”的所有文字、图片和音视频稿件,版权均属本网所有,任何媒体、

网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发表。已经本站协议授权的媒体、网站,在下载使用时

必须注明"稿件来源:sanwww.com",违者本站将依法追究责任。

2、本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着

赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。

3、考研试题、各种考试试题以及考试信息转载于各大bbs论坛,就其真实性本站无法证实,并不意味着赞同其观点。

如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
           最新热点        最新推荐        相关文章
    微软公布网络服务战略 将推网络版W
    微软正式公布新一代认证体系
    微软认证新动态:MCP认证考试新题型
    微软全新认证体系3门考试出炉
    微软新认证体系:三个系列 四大类证
    微软最新系统 Windows Vista硬件优
    微软上亿元订单引人才危机软测人才
    微软停止支持Windows98称为安全就别
    微软杀入杀毒软件市场国内厂商面临
    与微软争桌面市场自由软件要避其锋
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)