实验十一 网络编程.docx

上传人:b****5 文档编号:5908863 上传时间:2023-01-02 格式:DOCX 页数:11 大小:76.17KB
下载 相关 举报
实验十一 网络编程.docx_第1页
第1页 / 共11页
实验十一 网络编程.docx_第2页
第2页 / 共11页
实验十一 网络编程.docx_第3页
第3页 / 共11页
实验十一 网络编程.docx_第4页
第4页 / 共11页
实验十一 网络编程.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验十一 网络编程.docx

《实验十一 网络编程.docx》由会员分享,可在线阅读,更多相关《实验十一 网络编程.docx(11页珍藏版)》请在冰豆网上搜索。

实验十一 网络编程.docx

实验十一网络编程

 

《嵌入式操作系统应用开发》

课程实验报告

 

班级:

****************

学号:

*************

姓名:

**************

指导老师:

***************

成绩:

实验十一网络编程

一、目的与任务

目的:

了解掌握网络编程的特点与功能,学会借助网络系统的功能函数进行编程。

任务:

利用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是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

指导教师评语:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1