欢迎来到天天文库
浏览记录
ID:1222705
大小:38.50 KB
页数:4页
时间:2017-11-08
《raw协议网络编程(完整程序和注释)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、又用了一天,这次写好了,程序依然使用服务器/客户机模式,因此分为服务器程序部分和客户机部分,另外上次写的是面向连接的TCP协议模式,这次我换了一个尝试,使用面向非连接的UDP模式,程序和详细注释如下服务器程序serve.c用于发送数据,由于面向非连接,所以它只管发送,发送完了就结束,收没收到它不管#include#include#include#include#include#include2、/in.h>#include#include#include头文件#defineMYPORT4950端口号intmain(intargc,char*argv[])主程序两个参数分别为目标的ip地址,发送的数据{intsockfd;structhostent*he;structsockaddr_intheir_addr;intnumbytes;if(argc!=3)检查参数是否正确,如果输入参数不对,也就别继续了{fprintf(stder3、r,"usage:clienthostnamemessage");exit(1);}printf("0");if((he=gethostbyname(argv[1]))==NULL)这里用到了gethostbyname函数,返回一个指向填充好的数据结构hostent的指针,下面在给附地址值时候会用到这个指针{herror("gethostbyname");exit(1);}printf("1");下面开始调用socket来获得套接口if((sockfd=socket(AF_INET,SOCK_R4、AW,IPPROTO_UDP))==-1)注意这里的参数分别代表支持ipv4协议raw的原始套接口protocol选项为IPPROTO_UDP类型,这个很重要,内核根据这个参数包装数据的ip头{perror("socket");exit(1);}printf("2");获得了套接口后开始初始化their_addr.sin_family=AF_INET;their_addr.sin_port=htons(MYPORT);their_addr.sin_addr=*((structin_addr*)he->h5、_addr);bzero(&(their_addr.sin_zero),8);printf("3");printf("%s",argv[2]);由于是面向无连接的通信,有了套接口后就直接发送,目标的ip和发送数据现在都已经知道了numbytes=sendto(sockfd,argv[2],strlen(argv[2]),0,(structsockaddr*)&their_addr,sizeof(structsockaddr));printf("4");输出发送情况printf("sent%dby6、testo%s",numbytes,inet_ntoa(their_addr.sin_addr));close(sockfd);return0;}以上就是发送的程序,这里由于没有设置ip_HDRINCL选项,所以内核负责填充ip头并完成校验和的计算,发送程序只负责传输待发送的数据就好,如果你想自己构造ip头的话那就得设置ip_HDRINCL了,将其flag项置1下面是接收端client.c程序,同样必须采用原始套接字接口内核才会把收到的RAW数据传递给你这个接口#include#inc7、lude#include#include#include#include#include#include头文件#defineMYPORT4950端口号#definemaxbuflen100最大接受数据下面是主程序main(){intsockfd;structsockaddr_inmy_addr;structsockaddr_intheir_add8、r;intaddr_len,numbytes;charbuf[maxbuflen];前面声明一些结构体,这个在之前的编程中也有,一样的开始建立RAW套接口,这里的protocol选项必须与之前的一致,不然那边包装好的数据与这个接口就不符合了if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_UDP))==-1){perror("socket");exit(1);}printf("
2、/in.h>#include#include#include头文件#defineMYPORT4950端口号intmain(intargc,char*argv[])主程序两个参数分别为目标的ip地址,发送的数据{intsockfd;structhostent*he;structsockaddr_intheir_addr;intnumbytes;if(argc!=3)检查参数是否正确,如果输入参数不对,也就别继续了{fprintf(stder
3、r,"usage:clienthostnamemessage");exit(1);}printf("0");if((he=gethostbyname(argv[1]))==NULL)这里用到了gethostbyname函数,返回一个指向填充好的数据结构hostent的指针,下面在给附地址值时候会用到这个指针{herror("gethostbyname");exit(1);}printf("1");下面开始调用socket来获得套接口if((sockfd=socket(AF_INET,SOCK_R
4、AW,IPPROTO_UDP))==-1)注意这里的参数分别代表支持ipv4协议raw的原始套接口protocol选项为IPPROTO_UDP类型,这个很重要,内核根据这个参数包装数据的ip头{perror("socket");exit(1);}printf("2");获得了套接口后开始初始化their_addr.sin_family=AF_INET;their_addr.sin_port=htons(MYPORT);their_addr.sin_addr=*((structin_addr*)he->h
5、_addr);bzero(&(their_addr.sin_zero),8);printf("3");printf("%s",argv[2]);由于是面向无连接的通信,有了套接口后就直接发送,目标的ip和发送数据现在都已经知道了numbytes=sendto(sockfd,argv[2],strlen(argv[2]),0,(structsockaddr*)&their_addr,sizeof(structsockaddr));printf("4");输出发送情况printf("sent%dby
6、testo%s",numbytes,inet_ntoa(their_addr.sin_addr));close(sockfd);return0;}以上就是发送的程序,这里由于没有设置ip_HDRINCL选项,所以内核负责填充ip头并完成校验和的计算,发送程序只负责传输待发送的数据就好,如果你想自己构造ip头的话那就得设置ip_HDRINCL了,将其flag项置1下面是接收端client.c程序,同样必须采用原始套接字接口内核才会把收到的RAW数据传递给你这个接口#include#inc
7、lude#include#include#include#include#include#include头文件#defineMYPORT4950端口号#definemaxbuflen100最大接受数据下面是主程序main(){intsockfd;structsockaddr_inmy_addr;structsockaddr_intheir_add
8、r;intaddr_len,numbytes;charbuf[maxbuflen];前面声明一些结构体,这个在之前的编程中也有,一样的开始建立RAW套接口,这里的protocol选项必须与之前的一致,不然那边包装好的数据与这个接口就不符合了if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_UDP))==-1){perror("socket");exit(1);}printf("
此文档下载收益归作者所有