实验九 Linux网络编程(4课时)
实验目的:了解嵌入式网络开发环境的组成,掌握嵌入式网络程序设计
实验原理:
linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符,socket 起源于UNIX,在Unix一切皆文件的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个socket"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。socket 类型常见的socket有3种类型如下。
(1)流式socket(SOCK_STREAM )
流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
(2)数据报socket(SOCK_DGRAM )
数据报套接字定义了一种无连接的服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。
(3)原始socket(SOCK_RAW)
原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。
网络编程主要函数:
1.socket:创建一个socket
int socket(int family, int type, int protocol);
//family指定协议族;type参数指定socket的类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;protocol通常赋值"0", socket()调用返回一个整型socket描述符。
2.bind:用于绑定IP地址和端口号到socket
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
//sockfd是一个socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的针; addrlen常被设置为sizeof(struct sockaddr),bind()函数在成功被调用时返回0;遇到错误时返回"-1"并将errno置为相应的错误号。
3.connect:该函数用于绑定之后的client端,与服务器建立连接
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
//sockfd是目的服务器的sockect描述符;serv_addr是服务器端的IP地址和端口号的地址,addrlen常被设置为sizeof(struct sockaddr)。遇到错误时返回-1,并且errno中包含相应的错误码。
4.listen:设置能处理的最大连接数,listen()并未开始接受连线,只是设置sockect为listen 模式。
int listen(int sockfd,int backlog);
// sockfd是socket系统调用返回的服务器端socket描述符;backlog指定在请求队列中允许的最大请求数。
5.accept:用来接受socket连接
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
//sockfd是被监听的服务器socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求的客户端地址;addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。错误发生时返回一个-1并且设置相应的errno值。
6.send:发送数据
int send(int sockfd, const void *msg, int len, int flags);
//sockfd是你想用来传输数据的socket描述符,msg是一个指向要发送数据的指针。len 是以字节为单位的数据的长度。flags一般情况下置为0。
7.recv:接受数据
int recv(int sockfd,void *buf,int len,unsigned int flags);
//sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。flags也被置为0。recv()返回实际上接收的字节数,或当出现错误时,返回-1并置相应的errno值。
8.sendto:发送数据,用于面向非连接的socket(SOCK_DGRAM/SOCK_RAW)
int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to,int tolen);
//该函数比send()函数多了两个参数,to
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。
9.recvform: 接受数据,用于面向非连接的socket(SOCK_DGRAM/SOCK_RAW)
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
//from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen 常置为sizeof(struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno
几个字节顺序转换函数:
htons() --"Host to Network Short" ;
htonl()--"Host to Network Long"
ntohs() --"Network to Host Short" ;
ntohl()--"Network to Host Long"
在这里,h表示"host" ,n表示"network",s 表示"short",l表示"long"。
地址转换函数:
in_addr_t inet_addr(const char * strptr);
将字符串IP地址转换为IPv4地址结构in_addr值
char * inet_ntoa(struct in_addr * addrptr);
将IPv4地址结构in_addr值转换为字符串IP
域名和IP地址的转换:
struct hostent *gethostbyname(const char *name);
函数返回一种名为hostent的结构类型,它的定义如下:
struct hostent
{
char *h_name; /* 主机的官方域名*/
char **h_aliases; /* 一个以NULL结尾的主机别名数组*/
int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */
int h_length; /*地址的字节长度*/
char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/ };
#define h_addr h_addr_list[0] /*在h-addr-list中的第一个地址*/
面向TCP数据流的socket通信程序由基于TCP的服务器和基于TCP的客户端程序组成。
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数据报的socket通信程序由基于UCP的服务器和基于UDP的客户端程序组成。
UDP的服务器程序结构:
1.创建一个socket,用函数socket()
2.绑定IP地址、端口信息到socket上,用函数bind()
3.循环接受数据,用函数recvform()
4.关闭网络连接
UDP的客户端程序结构:
1.创建一个socket,用函数socket()
2.设置要连接的服务器的IP地址和端口属性
3.发送数据,用函数sento()
4.关闭网络连接
实验内容:1.编写面向TCP数据流的socket通信程序的sever和client端并运行查看运行情况。修改程序实现一个简单的聊天工具。修改了哪些内容,起何作用?
2.编写面向UDP数据流的socket通信程序的sever和client端并运行查看运
行情况。修改程序实现一个简单的聊天工具。修改了哪些内容,起何作用?
3.编写面向TCP数据流的基于多路复用的(使用select函数)socket通信程序的sever并运行。对比该模式与实验内容1运行情况的区别。
实验结果与讨论:
1、针对实验内容中的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
给出你的回答
2、谈谈你今天上实验课的收获,存在的问题或疑问。如果有实验内容以外的发现也可谈谈。注意:写实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
时,实验步骤不一定要全抄,可选重要的。但实验目的、实验内容以及实验步骤中提出的问题及
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
一定要写。