嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录
一、网络编程--OSI模型
二、网络编程--TCP/IP模型
三、网络接口
四、UDP网络相关编程及主要函数
编辑编辑 UDP的特征
socke函数
bind函数
recvfrom函数(接收函数)
sendto函数(发送函数)
五、网络编程之 UDP 用户数据报
1、特性: 无链接 不可靠 大数据
2、框架: C/S模式
3、代码示例
一、网络编程--OSI模型
二、网络编程--TCP/IP模型
三、网络接口
四、UDP网络相关编程及主要函数

UDP的特征
服务端:提供网络服务
客户端:使用网络服务
在网络程序,是客户端找服务器,服务器不能找客户端,故服务端需使用bind来绑定端口号;
socke函数
服务器端:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符
参数:domain 地址族,PF_INET == AF_INET ==>互联网程序
PF_UNIX == AF_UNIX ==>单机程序
type 套接字类型:
SOCK_STREAM 流式套接字 ===》TCP
SOCK_DGRAM 用户数据报套接字===>UDP
SOCK_RAW 原始套接字 ===》IP
protocol 协议 ==》0 表示自动适应应用层协议。(前面已经描述清楚,TCP\UDP都填0)
返回值:成功 返回申请的套接字id, 失败 -1;
bind函数
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联, 用于从该接口接受数据。
如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。
注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
my_addr 是物理接口的结构体指针。表示该接口的信息。
struct sockaddr 通用地址结构
{
u_short sa_family; 地址族
char sa_data[14]; 地址信息
};
转换成网络地址结构如下:
struct _sockaddr_in ///网络地址结构
{
u_short sin_family; 地址族
u_short sin_port; ///地址端口,一般建议值大于50000,使用htons(host to net short),进行地址转换(将一个无符号短整型数值转换为网络字节序,即大端模式)
struct in_addr sin_addr; ///地址IP,使用函数inet_addr(192.168.116.130);将字符串(小端)转为大端
char sin_zero[8]; 占位
};
struct in_addr
{
in_addr_t s_addr;
}
socklen_t addrlen: 参数2 的长度。
返回值:成功 0,失败 -1;
recvfrom函数(接收函数)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
收到buf 大小 一般默认为0 ,无人发送时阻塞
struct sockaddr *src_addr, socklen_t *addrlen);
对方地址 大小:int len = sizeof(cli);
&len
接收函数:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:用于UDP协议中获取对方发送的数据。
参数:sockfd 本地的套接字id
buff 要存储数据的内存区,一般是数组或者动态内存。
len 要获取的数据长度,一般是buff的大小。
flags 获取方式,0 阻塞
src_addr 可选,表示对方的地址信息结构体,
如果为NULL,表示不关心对方地址。
addrlen 对方地址信息结构体大小。
如果对方地址是NULL,则该值也为NULL。
返回值:成功 接收到的数据长度
失败 -1;
sendto函数(发送函数)
ssize_t sendto(int sockfd, const char *buf, size_t len, int flags,
发生buf内容
const struct sockaddr *dest_addr, socklen_t addrlen);
发给谁
发送函数:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:用于UDP协议中向对方发送数据。
参数:sockfd 本地的套接字id
buff 本地的数据存储,一般是要发送的数据。
len 要发送的数据长度
flags 要发送数据方式,0 表示阻塞发送。
dest_addr: 必选,表示要发送到的目标主机信息结构体。
addrlen :目标地址长度。
返回值:成功 发送的数据长度, 失败 -1;
注意:对于客户端,ser内容保留,获取iP地址;
当谁回应是确定的,recvfrom的地址为null,大小也为null;
若完成,关闭套接字,close();
五、网络编程之 UDP 用户数据报
1、特性: 无链接 不可靠 大数据
2、框架: C/S模式
server:socket() ===>bind()===>recvfrom()===>close()
client:socket() ===>bind()===>sendto() ===>close()
注意:socket()的参数需要调整。
socket(PF_INET,SOCK_DGRAM,0);
bind() 客户端是可选的,服务器端是比选的。
3、代码示例
服务端:
客户端: