《实验十一-网络编程》由会员分享,可在线阅读,更多相关《实验十一-网络编程(12页珍藏版)》请在金锄头文库上搜索。
1、嵌入式操作系统应用开发课程实验报告班 级: * 学 号: * 姓 名:* 指导老师: * 成 绩: 实验十一 网络编程一、目的与任务目的:了解掌握网络编程的特点与功能,学会借助网络系统的功能函数进行编程。任务:利用C语言指令编写程序调用网络系统函数,完成相应网络访问功能。二、内容、要求与安排方式1、实验内容与要求:1)利用地址处理函数访问网络地址以及编程实现域名与IP信息解析 。2)实现UDP广播与组播通信功能。3)练习原始套接口基本应用 。2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。三、程序清单(1)TCP服务器和TCP客户端通信1.1服务器代码;#include #
2、include #include #include #include #include #include #include #include /inet_ntoa()函数的头文件#define portnumber 3333 /定义端口号:(0-1024为保留端口号,最好不要用)int main(int argc, char *argv) int sockfd,new_fd; struct sockaddr_in server_addr; /描述服务器地址 struct sockaddr_in client_addr; /描述客户端地址 int sin_size; char hello=Hel
3、lo! Are You Fine?n; /* 服务器端开始建立sockfd描述符 */ if(sockfd=socket(AF_INET,SOCK_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
4、 server_addr.sin_addr.s_addr=htonl(INADDR_ANY); / (将本机器上的long数据转化为网络上的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数据)端口号 /* 捆绑soc
5、kfd描述符到IP地址 */ if(bind(sockfd,(struct sockaddr *)(&server_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); exit(1); while(1) /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(
6、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); / 将网络地址转换成.字符串,并打印到输出终端 /向客户端程序写入hello数组里的字符 if(write(new_fd,hello,s
7、trlen(hello)=-1) fprintf(stderr,Write Error:%sn,strerror(errno); exit(1); /* 这个通讯已经结束 */ close(new_fd); /* 循环下一个 */ /* 结束通讯 */ close(sockfd); exit(0); 1.2客户端代码;#include #include #include #include #include #include #include #include #include /inet_ntoa()函数的头文件#define portnumber 3333 /定义端口号:(0-1024为保留
8、端口号,最好不要用)int main(int argc, char *argv) int sockfd; char buffer1024; struct sockaddr_in server_addr; /描述服务器的地址 struct hostent *host; int nbytes; /* 使用hostname查询host 名字 */ if(argc!=2) fprintf(stderr,Usage:%s hostname an,argv0); exit(1); if(host=gethostbyname(argv1)=NULL) fprintf(stderr,Gethostname e
9、rrorn); exit(1); /* 客户程序开始建立 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.s
10、in_port=htons(portnumber); / (将本机器上的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(nbyte
11、s=read(sockfd,buffer,1024)=-1) fprintf(stderr,Read Error:%sn,strerror(errno); exit(1); buffernbytes=0; printf(I have received:%sn,buffer); /* 结束通讯 */ close(sockfd); exit(0); (2) UDP服务器和UDP客户端通信2.1UDP服务器代码;#include #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) /* 从网络上读,并写到网络