sendto函数的应用:向to结构体指针指向的IP,发送UDP数据
细节请看我注释,注满细节
代码:
#include <stdio.h>
#include <sys/socket.h> //socket函数
#include <unistd.h> //close函数
#include <string.h> //memset strlen函数
#include <netinet/in.h> //struct sockaddr_in结构体
#include <arpa/inet.h> //inet_pton函数
int main(int argc, char const *argv[])
{
// 创建用于通信的UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == 0)
{
perror("socket");
return 0;
}
printf("sockfd=%d\n", sockfd);
// 发送数据函数sendto:可以向to结构体指针指向的IP,发送UDP数据
char buf[] = "hello world";
// 目的地址信息
struct sockaddr_in dst_addr;
memset(&dst_addr, 0, sizeof(dst_addr)); // memset是初始化
dst_addr.sin_family = AF_INET; // IPV4
dst_addr.sin_port = htons(8000); // 端口(port)
// htons的功能:将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)
// 将目的IP赋值到地址结构体中
inet_pton(AF_INET, "192.168.31.37", &dst_addr.sin_addr.s_addr); // 将"10.9.11.251"转到s_addr里(大端)
char buf2[] = "你好,帅哥";
// 如果套接字,没有事先用(bind函数)绑定固定的IP及端口
// 那么第一次调用sendto的时候,系统会给本地主机IP,以及随机端口,作为发送者的源地址信息
sendto(sockfd, buf, strlen(buf), 0, (const struct sockaddr *)&dst_addr, sizeof(dst_addr));
sendto(sockfd, buf2, strlen(buf2), 0, (const struct sockaddr *)&dst_addr, sizeof(dst_addr));
close(sockfd);
}
详细解读:
-
头文件包含:
stdio.h
:标准输入输出库,用于printf
和perror
函数。sys/socket.h
:包含socket
函数的声明,用于创建套接字。unistd.h
:包含close
函数的声明,用于关闭套接字。string.h
:包含memset
和strlen
函数的声明,用于内存初始化和字符串长度计算。netinet/in.h
:定义了sockaddr_in
结构体,用于存储 IP 地址和端口信息。arpa/inet.h
:包含了一些网络编程中常用的函数,如inet_pton
。
-
在
main
函数中:- 创建一个 UDP 套接字
sockfd
,使用socket
函数,指定地址族为AF_INET
,类型为SOCK_DGRAM
表示 UDP 套接字。 - 如果
socket
函数返回值为 0,表示创建套接字失败,输出错误信息并返回。 - 初始化一个发送的数据
buf
,内容为 "hello world"。 - 初始化目的地址信息
dst_addr
结构体,将其清零并设置地址族为AF_INET
,端口为 8000。 - 使用
inet_pton
将目的IP地址 "192.168.31.37" 转换为网络字节序并赋值给dst_addr.sin_addr.s_addr
。 - 初始化另一个发送的数据
buf2
,内容为 "你好,帅哥"。 - 调用
sendto
函数两次,分别发送buf
和buf2
的数据到目的地址dst_addr
。 - 最后关闭套接字
sockfd
。
- 创建一个 UDP 套接字
这段代码通过 UDP 协议向指定的 IP 地址("192.168.31.37")的端口 8000 发送了两个数据包,分别是 "hello world" 和 "你好,帅哥"。发送数据时使用了 sendto
函数,该函数可以发送数据到指定的目的地址。在网络编程中,UDP 是一种无连接的传输协议,发送数据时不需要建立连接,适用于一些要求实时性较高的场景。