《2022年实验十一-网络编程 .pdf》由会员分享,可在线阅读,更多相关《2022年实验十一-网络编程 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式操作系统应用开发课程实验报告班级: * 学号: * 姓名:* 指导老师:* 成绩:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 实验十一网络编程一、目的与任务目的:了解掌握网络编程的特点与功能,学会借助网络系统的功能函数进行编程。任务:利用C 语言指令编写程序调用网络系统函数,完成相应网络访问功能。二、内容、要求与安排方式1、实验内容与要求:1)利用地址处理函数访问网络地址以及编程实现域名与IP 信息解析。2)实现 U
2、DP 广播与组播通信功能。3)练习原始套接口基本应用。2、实验安排方式:采用1 人 1 组,上机在Linux 系统下进行编程实验。三、程序清单(1)TCP 服务器和 TCP 客户端通信1.1 服务器代码 ; #include #include #include #include #include #include #include #include #include /inet_ntoa() 函数的头文件#define portnumber 3333 / 定义端口号:( 0-1024 为保留端口号,最好不要用)int main(int argc, char *argv) int sockfd,
3、new_fd; struct sockaddr_in server_addr; / 描述服务器地址名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - struct sockaddr_in client_addr; / 描述客户端地址int sin_size; char hello=Hello! Are You Fine?n; /* 服务器端开始建立 sockfd 描述符 */ if(sockfd=socket(AF_INET,SO
4、CK_STREAM,0)=-1) / AF_INET:IPV4;SOCK_STREAM:TCP fprintf(stderr,Socket error:%sna,strerror(errno); exit(1); /* 服务器端填充sockaddr结构 */ bzero(&server_addr,sizeof(struct sockaddr_in); / 初始化 ,置 0 server_addr.sin_family=AF_INET; / Internet server_addr.sin_addr.s_addr=htonl(INADDR_ANY); / (将本机器上的 long 数据转化为网络
5、上的 long 数据)和任何主机通信/INADDR_ANY 表示可以接收任意 IP 地址的数据,即绑定到所有的IP /server_addr.sin_addr.s_addr=inet_addr(192.168.1.1); / 用于绑定到一个固定IP,inet_addr用于把数字加格式的ip 转化为整形 ip server_addr.sin_port=htons(portnumber); / ( 将本机器上的 short数据转化为网络上的 short 数据)端口号/* 捆绑 sockfd描述符到 IP 地址 */ if(bind(sockfd,(struct sockaddr *)(&serve
6、r_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,Bind error:%sna,strerror(errno); exit(1); /* 设置允许连接的最大客户端数*/ if(listen(sockfd,5)=-1) fprintf(stderr,Listen error:%sna,strerror(errno); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - exit(
7、1); while(1) /* 服务器阻塞 ,直到客户程序建立连接*/ sin_size=sizeof(struct sockaddr_in); if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1) fprintf(stderr,Accept error:%sna,strerror(errno); exit(1); fprintf(stderr,Server get connection from %sn,inet_ntoa(client_addr.sin_addr); / 将网络地址转换成 .字符串,
8、并打印到输出终端/向客户端程序写入hello 数组里的字符if(write(new_fd,hello,strlen(hello)=-1) fprintf(stderr,Write Error:%sn,strerror(errno); exit(1); /* 这个通讯已经结束*/ close(new_fd); /* 循环下一个*/ /* 结束通讯*/ close(sockfd); exit(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - -
9、 - - - - 1.2 客户端代码;#include #include #include #include #include #include #include #include #include /inet_ntoa() 函数的头文件#define portnumber 3333 / 定义端口号:( 0-1024 为保留端口号,最好不要用)int main(int argc, char *argv) int sockfd; char buffer1024; struct sockaddr_in server_addr; / 描述服务器的地址struct hostent *host; int
10、 nbytes; /* 使用 hostname查询 host 名字 */ if(argc!=2) fprintf(stderr,Usage:%s hostname an,argv0); exit(1); if(host=gethostbyname(argv1)=NULL) fprintf(stderr,Gethostname errorn); exit(1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - /* 客户程序开始
11、建立sockfd 描述符 */ if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) / AF_INET:Internet;SOCK_STREAM:TCP fprintf(stderr,Socket Error:%san,strerror(errno); exit(1); /* 客户程序填充服务端的资料*/ bzero(&server_addr,sizeof(server_addr); / 初始化 ,置 0 server_addr.sin_family=AF_INET; / IPV4 server_addr.sin_port=htons(portnumber)
12、; / ( 将本机器上的 short数据转化为网络上的 short 数据)端口号server_addr.sin_addr=*(struct in_addr *)host-h_addr); / IP地址/* 客户程序发起连接请求*/ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,Connect Error:%san,strerror(errno); exit(1); /* 连接成功了*/ if(nbytes=read(sockfd,buffer,1024
13、)=-1) fprintf(stderr,Read Error:%sn,strerror(errno); exit(1); buffernbytes=0; printf(I have received:%sn,buffer); /* 结束通讯*/ close(sockfd); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - exit(0); (2) UDP 服务器和 UDP 客户端通信2.1UDP 服务器代码;#include
14、 #include #include #include #include #include #include #include #include #include #define SERVER_PORT 8888 /定义端口号:( 0-1024 为保留端口号,最好不要用)#define MAX_MSG_SIZE 1024 void udps_respon(int sockfd) struct sockaddr_in addr; int addrlen,n; char msgMAX_MSG_SIZE; while(1) /* 从网络上读 ,并写到网络上*/ bzero(msg,sizeof(ms
15、g); / 初始化 ,清零addrlen = sizeof(struct sockaddr); n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen); / 从客户端接收消息msgn=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - /* 显示服务端已经收到了信息*/ fprintf(stdout,Server have received
16、 %s,msg); / 显示消息 int main(void) int sockfd; /socket描述符struct sockaddr_in addr; / 定义服务器起地址/* 服务器端开始建立 socket描述符 */ sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0) fprintf(stderr,Socket Error:%sn,strerror(errno); exit(1); /* 服务器端填充sockaddr结构 */ bzero(&addr,sizeof(struct sockaddr_in); / 初始化 ,置 0 addr.
17、sin_family=AF_INET; / Internet addr.sin_addr.s_addr=htonl(INADDR_ANY); / ( 将本机器上的 long 数据转化为网络上的 long 数据)和任何主机通信/INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP /addr.sin_addr.s_addr=inet_addr(192.168.1.1); / 用于绑定到一个固定IP,inet_addr用于把数字加格式的ip 转化为整形 ip addr.sin_port=htons(SERVER_PORT); / ( 将本机器上的 short数据转化为网络上的
18、short 数据)端口号/* 捆绑 sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)0) fprintf(stderr,Bind Error:%sn,strerror(errno); exit(1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - udps_respon(sockfd); / 进行读写操作close(
19、sockfd); 2.2UDP 客户端代码#include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 8888 /定义端口号:( 0-1024 为保留端口号,最好不要用)#define MAX_BUF_SIZE 1024 void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len) char bufferMAX_BUF_SIZE; int n; while(1) /*
20、 从键盘读入 ,写到服务端*/ printf(Please input char:n); fgets(buffer,MAX_BUF_SIZE,stdin); sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)addr,len); bzero(buffer,MAX_BUF_SIZE); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - int main(int argc
21、,char *argv) int sockfd; /socket 描述符struct sockaddr_in addr; / 定义服务器起地址if(argc!=2) fprintf(stderr,Usage:%s server_ipn,argv0); exit(1); /* 建立 sockfd 描述符 */ sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0) fprintf(stderr,Socket Error:%sn,strerror(errno); exit(1); /* 填充服务端的资料*/ bzero(&addr,sizeof(struc
22、t sockaddr_in); / 初始化 ,置 0 addr.sin_family=AF_INET; / Internet addr.sin_port=htons(SERVER_PORT);/ ( 将本机器上的 short 数据转化为网络上的 short 数据)端口号if(inet_aton(argv1,&addr.sin_addr)0) /*inet_aton 函数用于把字符串型的IP地址转化成网络 2 进制数字 */ fprintf(stderr,Ip error:%sn,strerror(errno); exit(1); udpc_requ(sockfd,&addr,sizeof(st
23、ruct sockaddr_in); / 进行读写操作close(sockfd); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 四、实验过程(1) 运行 tcp 服务器段程序和客户端程序,显示过程(2)运行 udp 服务器段程序和客户端程序,显示过程截图五、实验体会TCP的服务器程序结构: 1. 创建一个 socket, 用函数 socket() 2. 绑定 IP 地址、端口信息到socket 上,用函数 bind()
24、3. 设置允许的最大连接数,用函数listen() 4. 接受客户端的连接,用函数accept() 5. 收发数据,用 send() 、recv() 或者 read() 、write() 6. 关闭网络连接TCP的客户端程序结构: 1. 创建一个 socket, 用函数 socket() 2. 设置要连接的服务器的IP 地址和端口属性 3. 连接服务器,用函数connet() 4. 收发数据,用 send() 、recv() 或者 read() 、write() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
25、- - - - - - 第 11 页,共 12 页 - - - - - - - - - 5. 关闭网络连接UDP 的服务器程序结构: 1. 创建一个 socket, 用函数 socket() 2. 绑定 IP 地址、端口信息到socket 上,用函数 bind() 3. 循环接受数据,用函数recvform() 4. 关闭网络连接UDP 的客户端程序结构: 1. 创建一个 socket, 用函数 socket() 2. 设置要连接的服务器的IP 地址和端口属性 3. 发送数据,用函数 sento() 4. 关闭网络连接linux 网络编程是通过 socket( 套接字 ) 接口实现, Socket 是一种文件描述符,socket 起源于 UNIX ,在 Unix 一切皆文件哲学的思想下,socket 是一种 打开读/ 写关闭 模式的实现, 服务器和客户端各自维护一个文件 ,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。指导教师评语:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -
限制150内