UDP 通信创建流程
UDP 是⼀个传输层的⽆连接的协议,我们编写代码⼀般是分为两个端。⼀个我们称之为发送端,另⼀
个我们称之为接收端。正常⼀般是接收端先运⾏,然后等待结束发送端发送过来的数据。
创建套接字
首先,我们需要创建套接字,套接字是通信的基础。我们可以通过 socket() 函数来创建套接字。
int socket(int domain, int type, int protocol);
参数:
@domain
地址族
AF_UNIX, AF_LOCAL 本地通信,数据不仅过网卡
AF_INET IPV4 ineter⽹通信
AF_INET6 IPV6 ineter⽹通信
AF_PACKET 网卡上的数据包通信
....
@ type
使⽤协议类型
SOCK_STREAM 流式套接字(TCP)
SOCK_DGRAM 报⽂套接字(UDP)
SOCK_RAW原始套接字: (IP,ICMP)
......
@protocol
协议编号
0 : 让系统⾃动识别
IPPROTO_TCP : TCP协议
IPPROTO_UDP : UDP协议
返回值:
成功返回得到的⽂件描述符。当前可使用的最小描述符
失败返回 -1
发送消息 sendto()
发送端通过 sendto() 函数来发送消息。
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
@sockfd 套接字文件描述符
@buf 发送内容 数据存放的⾸地址
@len 期望发送的数据的长度⼤⼩
@flags 操作⽅式 0 表示默认操作
@dest_addr 向指定的地址发送数据
@addrlen 发送的地址的⼤⼩
返回值:
成功返回实际发送的字节数,失败返回-1
struct sockaddr {
unsigned short sa_family; // 地址族 对应socket()中的domain
char sa_data[14]; // 地址数据 ip地址端口信息
};
struct sockaddr_in {
short int sin_family; // 地址族 AF_INET
unsigned short int sin_port; // 端口号
struct in_addr sin_addr;// IP地址
unsigned char sin_zero[8]; // 填充字节 为了对齐sockaddr
};
struct in_addr {
uint32_t s_addr; // IP地址
};
示例用法:
//填充信息
struct sockaddr_in peer_addr;
peer_addr.sin_family = AF_INET;
peer_addr.sin_port = htons(8080);
peer_addr.sin_addr.s_addr = inet_addr("192.168.0.88");
//发送信息
n = sendto(sockfd,buf,n,0,(struct sockaddr *)&peer_addr,sizeof(struct sockaddr_in));
示例 发送数据
// todo UDP发送端