tcpip协议与网络编程实验指导书内容摘要:

机的 arp 高速缓存上,就不用再进行 arp 请求 )。 实验中看不到这样的差别,是由于 Windows 系统所使用的时钟精度的限制。 下图为在一个 Linux 系统中所完成的实验结果: 以下是 使用 Ethereal 在局域网上抓 包的结果,每秒发送和接收一次 ICMP 回显。 ping 非本局域网上的一台主机的输出 为什么第一次所花的时间比较长呢。 arp –a 显示的缓存表中包含有网关的MAC 地址。 根据下面的抓包结果分析一下。 五、思考题及其它 实验 三 : 编写 Ping 程序 实验学时: 2 实验类型: 设计型 一、实验目的 通过本实验的学习,使学生 了解 Winsock 编程的一般方法和编程模型;熟悉Winsock 中原始套接字的使用;能利用 Winsock2 编写简单的 ping 程序。 二、实验条件 局域网, Windows 2020。 三、实验原理及相关知识 Ping 作用:网络连通性的测试。 Ping 报文的结构:参见理论教材。 四、实验步骤 实验前需要阅读和理解 ICMP 的功能、 ICMP 报文的结构等基本的理论知识; 掌握 Visual C++ 的基本使用; 在 VC6 中,利用应用程序向导创建一个 Win32 控制台程序的空项目,如下图所示。 在项目中添加一个 C++源文件: 加入包含文件和符号常量的定义: include include include define SEND_SIZE 32 define PACKET_SIZE 4096 define ICMP_ECHO 8 define ICMP_ECHOREPLY 0 定义对应 IP 报文和 ICMP 报文结构的结构体: struct icmp { unsigned char icmp_type。 unsigned char icmp_code。 unsigned short icmp_cksum。 unsigned short icmp_id。 unsigned short icmp_seq。 unsigned long icmp_data。 }。 struct ip { unsigned char ip_hl:4。 unsigned char ip_v:4。 unsigned char ip_tos。 unsigned short ip_len。 unsigned short ip_id。 unsigned short ip_off。 unsigned char ip_ttl。 unsigned char ip_p。 unsigned short ip_sum。 unsigned long ip_src。 unsigned long ip_dst。 }。 定义全局变量和函数: unsigned char sendpacket[PACKET_SIZE]。 unsigned char recvpacket[PACKET_SIZE]。 struct sockaddr_in dest_addr。 struct sockaddr_in from_addr。 int sockfd。 int pid。 unsigned short cal_chksum(unsigned short *addr,int len)。 int pack(int pack_no)。 int unpack(unsigned char *buf,int len)。 void send_packet(void)。 void recv_packet(void)。 定义 main()函数及检测命令行参数: void main(int argc,char *argv[]) { struct hostent *host。 struct protoent *protocol。 WSADATA wsaData。 int timeout=1000。 int SEND_COUNT=4。 int i。 char *par_host。 par_host=argv[argc1]。 switch(argc) { case 2: break。 case 3: if(strcmp(argv[1],t)==0) { SEND_COUNT=10000。 break。 } //fall through default: printf(usage: %s [t] Host name or IP address\n,argv[0])。 exit(1)。 } 创建原始套接字: if(WSAStartup(0x1010,amp。 wsaData)!=0) { printf(wsastartup error\n)。 exit(1)。 } if( (protocol=getprotobyname(icmp) )==NULL) { printf(getprotobyname error\n)。 exit(1)。 } if( (sockfd=socket(AF_INET,SOCK_RAW,protocolp_proto) )0) { printf(socket error\n)。 exit(1)。 } 其中: ( 1)使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数。 该函数的第一个参数指明程序请求使用的 Socket 版本, 其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的 Socket 的版本信息。 ( 2) getprotobyname: 功能:依照通讯协议 (protocol) 的名称来获取该通讯协定的其他资料; 格式: struct protoe。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。