您好,欢迎访问三七文档
《嵌入式操作系统应用开发》课程实验报告班级:****************学号:*************姓名:**************指导老师:***************成绩:实验十一网络编程一、目的与任务目的:了解掌握网络编程的特点与功能,学会借助网络系统的功能函数进行编程。任务:利用C语言指令编写程序调用网络系统函数,完成相应网络访问功能。二、内容、要求与安排方式1、实验内容与要求:1)利用地址处理函数访问网络地址以及编程实现域名与IP信息解析。2)实现UDP广播与组播通信功能。3)练习原始套接口基本应用。2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。三、程序清单(1)TCP服务器和TCP客户端通信1.1服务器代码;#includestdlib.h#includestdio.h#includeerrno.h#includestring.h#includenetdb.h#includesys/types.h#includenetinet/in.h#includesys/socket.h#includearpa/inet.h//inet_ntoa()函数的头文件#defineportnumber3333//定义端口号:(0-1024为保留端口号,最好不要用)intmain(intargc,char*argv[]){intsockfd,new_fd;structsockaddr_inserver_addr;//描述服务器地址structsockaddr_inclient_addr;//描述客户端地址intsin_size;charhello[]=Hello!AreYouFine?\n;/*服务器端开始建立sockfd描述符*/if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//AF_INET:IPV4;SOCK_STREAM:TCP{fprintf(stderr,Socketerror:%s\n\a,strerror(errno));exit(1);}/*服务器端填充sockaddr结构*/bzero(&server_addr,sizeof(structsockaddr_in));//初始化,置0server_addr.sin_family=AF_INET;//Internetserver_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转化为整形ipserver_addr.sin_port=htons(portnumber);//(将本机器上的short数据转化为网络上的short数据)端口号/*捆绑sockfd描述符到IP地址*/if(bind(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1){fprintf(stderr,Binderror:%s\n\a,strerror(errno));exit(1);}/*设置允许连接的最大客户端数*/if(listen(sockfd,5)==-1){fprintf(stderr,Listenerror:%s\n\a,strerror(errno));exit(1);}while(1){/*服务器阻塞,直到客户程序建立连接*/sin_size=sizeof(structsockaddr_in);if((new_fd=accept(sockfd,(structsockaddr*)(&client_addr),&sin_size))==-1){fprintf(stderr,Accepterror:%s\n\a,strerror(errno));exit(1);}fprintf(stderr,Servergetconnectionfrom%s\n,inet_ntoa(client_addr.sin_addr));//将网络地址转换成.字符串,并打印到输出终端//向客户端程序写入hello数组里的字符if(write(new_fd,hello,strlen(hello))==-1){fprintf(stderr,WriteError:%s\n,strerror(errno));exit(1);}/*这个通讯已经结束*/close(new_fd);/*循环下一个*/}/*结束通讯*/close(sockfd);exit(0);}1.2客户端代码;#includestdlib.h#includestdio.h#includeerrno.h#includestring.h#includenetdb.h#includesys/types.h#includenetinet/in.h#includesys/socket.h#includearpa/inet.h//inet_ntoa()函数的头文件#defineportnumber3333//定义端口号:(0-1024为保留端口号,最好不要用)intmain(intargc,char*argv[]){intsockfd;charbuffer[1024];structsockaddr_inserver_addr;//描述服务器的地址structhostent*host;intnbytes;/*使用hostname查询host名字*/if(argc!=2){fprintf(stderr,Usage:%shostname\a\n,argv[0]);exit(1);}if((host=gethostbyname(argv[1]))==NULL){fprintf(stderr,Gethostnameerror\n);exit(1);}/*客户程序开始建立sockfd描述符*/if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//AF_INET:Internet;SOCK_STREAM:TCP{fprintf(stderr,SocketError:%s\a\n,strerror(errno));exit(1);}/*客户程序填充服务端的资料*/bzero(&server_addr,sizeof(server_addr));//初始化,置0server_addr.sin_family=AF_INET;//IPV4server_addr.sin_port=htons(portnumber);//(将本机器上的short数据转化为网络上的short数据)端口号server_addr.sin_addr=*((structin_addr*)host-h_addr);//IP地址/*客户程序发起连接请求*/if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1){fprintf(stderr,ConnectError:%s\a\n,strerror(errno));exit(1);}/*连接成功了*/if((nbytes=read(sockfd,buffer,1024))==-1){fprintf(stderr,ReadError:%s\n,strerror(errno));exit(1);}buffer[nbytes]='\0';printf(Ihavereceived:%s\n,buffer);/*结束通讯*/close(sockfd);exit(0);}(2)UDP服务器和UDP客户端通信2.1UDP服务器代码;#includestdlib.h#includestdio.h#includeerrno.h#includestring.h#includeunistd.h#includenetdb.h#includesys/socket.h#includenetinet/in.h#includesys/types.h#includearpa/inet.h#defineSERVER_PORT8888//定义端口号:(0-1024为保留端口号,最好不要用)#defineMAX_MSG_SIZE1024voidudps_respon(intsockfd){structsockaddr_inaddr;intaddrlen,n;charmsg[MAX_MSG_SIZE];while(1){/*从网络上读,并写到网络上*/bzero(msg,sizeof(msg));//初始化,清零addrlen=sizeof(structsockaddr);n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(structsockaddr*)&addr,&addrlen);//从客户端接收消息msg[n]=0;/*显示服务端已经收到了信息*/fprintf(stdout,Serverhavereceived%s,msg);//显示消息}}intmain(void){intsockfd;//socket描述符structsockaddr_inaddr;//定义服务器起地址/*服务器端开始建立socket描述符*/sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){fprintf(stderr,SocketError:%s\n,strerror(errno));exit(1);}/*服务器端填充sockaddr结构*/bzero(&addr,sizeof(structsockaddr_in));//初始化,置0addr.sin_family=AF_INET;//Internetaddr.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转化为整形ipaddr.sin_port=htons(SERVER_PORT);//(将本机器上的short数据转化为网络上的short数据)端口号/*捆绑sockfd描述符*/if(bind(sockfd,(structsockaddr*)&addr,sizeof(structsockaddr_in))0){fprintf(stderr,BindError:%s\n,strerror(errno));exit(1);}udps_respon(sockfd);//进行读写操作close(sockfd);}2.2UDP客户端代码#includestdlib.h#includestdio.h#includeerrno.h#includestring.h#includeunistd.h#includenetdb.h#includesys/socket.h#includenetinet/in.h#includesys/types.h#includearpa/inet.h#defineSERVER_PORT8888//定义端口号:(0-1024为保留端口号,最好不要用)#defineMAX_BUF_SIZE1024voidudpc_requ(intsockfd,conststructsoc
本文标题:实验十一 网络编程
链接地址:https://www.777doc.com/doc-6042451 .html