字节序
概念:是指多字节数据的存储顺序
- 小端格式:将低位字节数据存储在低地址(LSB)
- 大端格式:将高位字节数据存储在低地址(MSB)
特点
1、网络协议指定了通讯字节序—大端
2、只有在多字节数据处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序
2.03字节序转换函数
host---主机字节序
network---网络字节序
htonl函数:将32位主机字节序数据转换成网络字节序数据
htons函数:将16位主机字节序数据转换成网络字节序数据
ntohl函数:将32位网络字节序数据转换成主机字节序数据
ntohs函数:将16位网络字节序数据转换成主机字节序数据
2.04 IP地址转换函数
IP地址人为识别为:字符串,在计算机中以整数识别
inet_pton:字符串格式转整型 inet_pton(int family,const char *strptr, void *addrptr);
- family 协议族 选IPV4对应的宏AF_INET
- strptr 点分十进制数串
- addrptr 32位无符号整数的地址
inet_ntop:整型数据转字符串格式 inet_ntop(int family, const void *addrptr,char *strptr, size_t len);
- family 协议族
- addrptr 32位无符号整数
- strptr 点分十进制数串
- len strptr缓存区长度
inet_ntoa():整型数据转字符串格式 inet_ntoa()
2.05 UDP协议
面向无连接的用户数据报协议,在传输数据前不需要先建立连接;目地主机的运输层收到UDP报文后,不需要给出任何确认
UDP特点
1、相比TCP速度稍快些
2、简单的请求/应答应用程序可以使用UDP
3、对于海量数据传输不应该使用UDP
4、广播和多播应用必须使用UDP
UDP应用
DNS(域名解析)、NFS(网络文件系统)、RTP(流媒体)等、音视频通话
2.05网络编程接口socket
2.06 UDP编程C/S架构流程图
2.4 UDP编程-发送、绑定、接收数据
2.3 UDP编程-创建套接字
2.3.1创建socket套接字
int socket(int family,int type,int protocol); 功能: 创建一个用于网络通信的socket套接字(描述符) 参数: family:协议族(AF_INET、AF_INET6、PF_PACKET等) //流式套接字 用于TCP通信 /报式套接字 用于UDP通信 type:套接字类(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW等) protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP等) /0自动指定协议
2.4.1 IPv4套接字地址结构
头文件:#include <netinet/in.h> struct in_addr { in_addr_t s_addr;//4字节 }; struct sockaddr_in//网络编程中经常使用的结构体 { sa_family_t sin_family;//协议族,2字节 in_port_t sin_port;//端口号,2字节 struct in_addr sin_addr;//IP地址,4字节 char sin_zero[8]//填充,不起什么作用8字节 }; 为了使不同格式地址能被传入套接字函数,地址须要强制转换成通用套接字地址结构 头文件:#include <netinet/in.h> struct sockaddr//通用结构体 { sa_family_t sa_family; // 2字节 char sa_data[14] // 14字节 }; 、
fgets(char *str, int n, FILE *stream)函数
参数
- str-- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n-- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
stdin
2.4.2 发送数据—sendto函数
ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen); 功能: 向to结构体指针中指定的ip,发送UDP数据 参数: sockfd:套接字 buf: 发送数据的地址 nbytes: 发送数据的大小 flags: 一般为0 to: 指向目的主机地址结构体的指针 addrlen:to所指向内容的长度 注意: 通过to和addrlen确定目的地址 可以发送0长度的UDP数据包 返回值: 成功:发送数据的字符数 失败: -1
2.4.6绑定 bind函数
UDP网络程序想要收取数据需什么条件?
- 确定的ip地址
- 确定的port
怎样完成上面的条件呢?
- 接收端 使用bind函数,来完成地址结构与socket套接字的绑定,这样ip、port就固定了
- 发送端 在sendto函数中指定接收端的ip、port,就可以发送数据了
int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen); 功能: 将本地协议地址与sockfd绑定 参数: sockfd: socket套接字 myaddr: 指向特定协议的地址结构指针 addrlen:该地址结构的长度 返回值: 成功:返回0 失败:其他
2.4.8接收数据—recvfrom 函数
ssize_t recvfrom(int sockfd, void *buf,size_t nbytes,int flags, struct sockaddr *from,socklen_t *addrlen); 功能: 接收UDP数据,并将源地址信息保存在from指向的结构中 参数: sockfd: 套接字 buf: 接收数据缓冲区地址 nbytes: 接收数据缓冲区的大小 flags: 套接字标志(常为0) from: 源地址结构体指针,用来保存数据的来源 addrlen: from所指内容的长度 注意: 通过from和addrlen参数存放数据来源信息 from和addrlen可以为NULL, 表示不保存数据来源 返回值: 成功:接收到的字符数 失败: -1
标签:UDP,字节,family,int,编程,地址,接字 From: https://www.cnblogs.com/gaishuobulao/p/17441829.html