UDP编程

字节序

概念:是指多字节数据的存储顺序

  • 小端格式:将低位字节数据存储在低地址(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 familyconst void *addrptr,char *strptrsize_t len);

  • family 协议族
  • addrptr 32位无符号整数
  • strptr 点分十进制数串
  • len strptr缓存区长度
inet_addr():字符串格式转整型数据  inet_addr()

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

 

posted @ 2023-06-09 21:13  该说不唠  阅读(45)  评论(0)    收藏  举报