实验十一 网络编程.docx
《实验十一 网络编程.docx》由会员分享,可在线阅读,更多相关《实验十一 网络编程.docx(11页珍藏版)》请在冰豆网上搜索。
实验十一网络编程
《嵌入式操作系统应用开发》
课程实验报告
班级:
****************
学号:
*************
姓名:
**************
指导老师:
***************
成绩:
实验十一网络编程
一、目的与任务
目的:
了解掌握网络编程的特点与功能,学会借助网络系统的功能函数进行编程。
任务:
利用C语言指令编写程序调用网络系统函数,完成相应网络访问功能。
二、内容、要求与安排方式
1、实验内容与要求:
1)利用地址处理函数访问网络地址以及编程实现域名与IP信息解析。
2)实现UDP广播与组播通信功能。
3)练习原始套接口基本应用。
2、实验安排方式:
采用1人1组,上机在Linux系统下进行编程实验。
三、程序清单
(1)TCP服务器和TCP客户端通信
1.1服务器代码;
#include
#include
#include
#include
#include
#include
#include
#include
#include//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));//初始化,置0
server_addr.sin_family=AF_INET;//Internet
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数据)端口号
/*捆绑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客户端代码;
#include
#include
#include
#include
#include
#include
#include
#include
#include//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));//初始化,置0
server_addr.sin_family=AF_INET;//IPV4
server_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服务器代码;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVER_PORT8888//定义端口号:
(0-1024为保留端口号,最好不要用)
#defineMAX_MSG_SIZE1024
voidudps_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(sockfd<0)
{
fprintf(stderr,"SocketError:
%s\n",strerror(errno));
exit
(1);
}
/*服务器端填充sockaddr结构*/
bzero(&addr,sizeof(structsockaddr_in));//初始化,置0
addr.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数据转化为网络上的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客户端代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVER_PORT8888//定义端口号:
(0-1024为保留端口号,最好不要用)
#defineMAX_BUF_SIZE1024
voidudpc_requ(intsockfd,conststructsockaddr_in*addr,intlen)
{
charbuffer[MAX_BUF_SIZE];
intn;
while
(1)
{/*从键盘读入,写到服务端*/
printf("Pleaseinputchar:
\n");
fgets(buffer,MAX_BUF_SIZE,stdin);
sendto(sockfd,buffer,strlen(buffer),0,(structsockaddr*)addr,len);
bzero(buffer,MAX_BUF_SIZE);
}
}
intmain(intargc,char**argv)
{
intsockfd;//socket描述符
structsockaddr_inaddr;//定义服务器起地址
if(argc!
=2)
{
fprintf(stderr,"Usage:
%sserver_ip\n",argv[0]);
exit
(1);
}
/*建立sockfd描述符*/
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
fprintf(stderr,"SocketError:
%s\n",strerror(errno));
exit
(1);
}
/*填充服务端的资料*/
bzero(&addr,sizeof(structsockaddr_in));//初始化,置0
addr.sin_family=AF_INET;//Internet
addr.sin_port=htons(SERVER_PORT);//(将本机器上的short数据转化为网络上的short数据)端口号
if(inet_aton(argv[1],&addr.sin_addr)<0)/*inet_aton函数用于把字符串型的IP地址转化成网络2进制数字*/
{
fprintf(stderr,"Iperror:
%s\n",strerror(errno));
exit
(1);
}
udpc_requ(sockfd,&addr,sizeof(structsockaddr_in));//进行读写操作
close(sockfd);
}
四、实验过程
(1)运行tcp服务器段程序和客户端程序,显示过程
(2)运行udp服务器段程序和客户端程序,显示过程截图
五、实验体会
TCP的服务器程序结构:
1.创建一个socket,用函数socket()
2.绑定IP地址、端口信息到socket上,用函数bind()
3.设置允许的最大连接数,用函数listen()
4.接受客户端的连接,用函数accept()
5.收发数据,用send()、recv()或者read()、write()
6.关闭网络连接
TCP的客户端程序结构:
1.创建一个socket,用函数socket()
2.设置要连接的服务器的IP地址和端口属性
3.连接服务器,用函数connet()
4.收发数据,用send()、recv()或者read()、write()
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是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
指导教师评语: