资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
物联网工程学院实验报告课程名称电脑网络实验名称编程实现 ping 命令实验日期2012- 5 - 1班级计科学号03040实验报告要求1实验名称2实验要求3实验环境4实验步骤(写明实验结果)5实验体会实验实验 3 3编程实现编程实现 pingping 命令命令实验截图:实验截图:实验代码:实验代码:#pragma pack(4)#include winsock2.h#include stdlib.h#include stdio.h#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 headerunsigned int version:4; / Version of IPunsigned char tos; / Type of serviceunsigned short total_len; / total length of the packetunsigned short ident; / unique identifierunsigned short frag_and_flags; / flagsunsigned char ttl;unsigned char proto; / protocol (TCP, UDP etc)unsigned short checksum; / IP checksumunsigned 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_sizen,progname);fprintf(stderr,datasize can be up to 1Kbn);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: %dn,GetLastError();ExitProcess(STATUS_FAILED);if (argc h_addr,hp-h_length);elsedest.sin_addr.s_addr = addr;if (hp)dest.sin_family = hp-h_addrtype;elsedest.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(argc2)times=atoi(argv2);if(times = 0) times=DEF_PACKET_NUMBER;else times=DEF_PACKET_NUMBER;if (argc 3)datasize = atoi(argv3); if (datasize = 0) datasize = DEF_PACKET_SIZE;if (datasize 1024) /* 用户给出的数据包大小太大 */ fprintf(stderr,WARNING : data_size is too large !n); datasize = DEF_PACKET_SIZE;else datasize = DEF_PACKET_SIZE;datasize += sizeof(IcmpHeader);icmp_data = (char*)xmalloc(MAX_PACKET);recvbuf = (char*)xmalloc(MAX_PACKET);if (!icmp_data) fprintf(stderr,HeapAlloc failed %dn,GetLastError();ExitProcess(STATUS_FAILED);memset(icmp_data,0,MAX_PACKET);fill_icmp_data(icmp_data,datasize);/显示提示信息/fprintf(stdout,nPinging %s .nn,dest_ip);for(int i=0;iint 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: %dn,WSAGetLastError();ExitProcess(STATUS_FAILED);if (bwrote h_len) * 4 ; / number of 32-bit words *4 = bytesif (bytes sin_addr);icmphdr = (IcmpHeader*)(buf + iphdrlen);if (icmphdr-i_type != ICMP_ECHOREPLY) fprintf(stderr,non-echo type %d recvdn,icmphdr-i_type);return 1;if (icmphdr-i_id != (USHORT)GetCurrentProcessId() fprintf(stderr,someone elses packet!n);return 1;printf(%d bytes from %s:,bytes, inet_ntoa(from-sin_addr);printf( icmp_seq = %d. ,icmphdr-i_seq);printf( time: %d ms ,GetTickCount()-icmphdr-timestamp);printf(n);return 0;USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0;while(size 1) cksum+=*buffer+;size -=sizeof(USHORT);if(size) cksum += *(UCHAR*)buffer;cksum = (cksum 16) + (cksum & 0xffff);cksum += (cksum 16);return (USHORT)(cksum);/*Helper function to fill in various stuff in our ICMP request.*/void fill_icmp_data(char * icmp_data, int datasize)IcmpHeader *icmp_hdr;char *datapart;icmp_hdr = (IcmpHeader*)icmp_data;icmp_hdr-i_type = ICMP_ECHO;icmp_hdr-i_code = 0;icmp_hdr-i_id = (USHORT)GetCurrentProcessId();icmp_hdr-i_cksum = 0;icmp_hdr-i_seq = 0;datapart = icmp_data + sizeof(IcmpHeader);/ Place some junk in the buffer./memset(datapart,E, datasize - sizeof(IcmpHeader);不教师评价优良中及及格格教师签名日期
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号