恳求各位大哥大姐兄弟姐妹们,我这个程序就像ping一个确定的IP地址,但不知从何下手还请各位多帮忙啊!由于帖子过长,只能删掉后面的函数部分。
上程序:#pragma pack(4)  
#include   "winsock2.h" 
#include   "stdlib.h" 
#include   "time.h"
#include   "stdio.h" 
#include "process.h"
#define ICMP_ECHO 8  
#define ICMP_ECHOREPLY 0  
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)  
FILE *stream;
/* 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 MAX_PACKET 65532 
#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,j;  
int sendnum;
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;  
int Timeinterval;
//建立原始套接口
if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){  
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());  
ExitProcess(STATUS_FAILED);  
}  
 
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);  
}  //设置IP地址   但不知道怎么改
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 ! 
// 
//生成报文
fprintf(stdout,"\nPinging %s ....\n\n",dest_ip);
printf("发送数报文长度:",j);
scanf("%d",&j);
if(argc>2) 

times=atoi(argv[2]); 
if(times == 0) 
  times=sendnum; 

else 
    times=sendnum; 
if (argc >3)  
{  
datasize = atoi(argv[3]);  
    if (datasize == 0)  
        datasize = j; 
if (datasize >65500)   /* 用户给出的数据包大小太大 */ 

  fprintf(stderr,"WARNING : data_size is too large !\n"); 
  datasize = j;  

}  
else  
    datasize =j;  
datasize += sizeof(IcmpHeader);  
icmp_data = (char*)xmalloc(MAX_PACKET);  
recvbuf = (char*)xmalloc(MAX_PACKET);  
if (!icmp_data) {  
fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());  
ExitProcess(STATUS_FAILED);  
}  memset(icmp_data,0,MAX_PACKET);  
fill_icmp_data(icmp_data,datasize);  
// 
//显示提示信息 
// 
 
printf("发送数据包的个数:",sendnum);
scanf("%d",&sendnum);
printf("发送时间间隔:",Timeinterval);
scanf("%d",&Timeinterval);
stream=fopen("fprintf.out","w");
for(int i=0;i<sendnum;i++){  
int bwrote;  ((IcmpHeader*)icmp_data)->i_cksum = 0;  
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();  
((IcmpHeader*)icmp_data)->i_seq = seq_no++;  
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize); 
//发送报文
bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));  
if (bwrote == SOCKET_ERROR){  
if (WSAGetLastError() == WSAETIMEDOUT) {  
printf("Request timed out.\n");  
continue;  
}  
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());  
ExitProcess(STATUS_FAILED);  
}  
if (bwrote < datasize ) {  
fprintf(stdout,"Wrote %d bytes\n",bwrote);  
}  
//接收报文
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);  
if (bread == SOCKET_ERROR){  
if (WSAGetLastError() == WSAETIMEDOUT) {  
printf("Request timed out.\n");  
continue;  
}  
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());  
ExitProcess(STATUS_FAILED);  

//获取系统时间 
struct   tm   when;   
time_t  now, result;   
int    days;   
time(   &now   );   
when = *localtime(&now);   
fprintf(stream,"%s",asctime(&when));  if(!decode_resp(recvbuf,(bread-32),&from)) 
statistic++; /* 成功接收的数目++ */ 
fprintf(stream,"\n");
Sleep(Timeinterval);  
} /* 
Display the statistic result 
*/ 
  
fprintf(stream,"\nPing statistics for %s \n",dest_ip); 
fprintf(stream,"Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",sendnum, 
     statistic,(sendnum-statistic),(float)(sendnum-statistic)/sendnum*100); WSACleanup(); 
return 0;  
fclose(stream);
}  
/*