我认为您混淆了“消息”和“dest_addr”。
让我们看一下展开形式的 sendto 原型:
ssize_t sendto (int sockfd,
const void *buf,
size_t length,
int flags,
const struct sockaddr *dest_addr,
socklen_t addrlen);
sockfd - 这是您通过调用 socket() 创建的套接字
buf - 这是一个指向 ARRAY OF BYTES 的指针(即它们可以制作 char* 类型的 buf)。也就是说,这是您希望通过封装在 UDP 数据包中的线路发送的数据。
长度 - 这是该数组中有多少字节。如果你没有传递“length”,它就不会知道“buf”是 1 字节还是 10000 字节。
flags - 通常为 0。这是高级的东西
dest_addr - 这是一个指向目标地址的指针。通常,您初始化 sockaddr_in 实例并将其指针值转换为 sockaddr* 类型。
addrlen - dest_addr 的大小。通常,sizeof(sockaddr_in)。地址长度是可变的,因为 dest_addr 可以指向 IPV4 地址(sockaddr_in 类型)或 IPV6 地址(sockaddr_in6 类型)或其他类型。
从本地端口 9999 向远程主机“1.2.3.4”的端口 8888 发送数据包的示例。为简洁起见,省略了返回代码的错误检查。
int s;
sockaddr_in addrDest;
sockaddr_in addrLocal;
char* msg = "Hello World";
// create the socket
s = socket(AF_INET, SOCK_DGRAM, 0); // UDP socket
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(9999);
addrLocal.sin_addr = INADDR_ANY; // zero-init sin_addr to tell it to use all available adapters on the local host
// associate this socket with local UDP port 9999
result = bind(s, (struct sockaddr*)&addrLocal, 0);
// send "Hello world" from local port 9999 to the host at 1.2.3.4 on its port 8888
addrDest.sin_family = AF_INET;
addrDest.sin_port = htons(8888);
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4");
// strlen(msg)+1 for terminating null char
result = sendto(s, msg, strlen(msg)+1, 0, (struct sockaddr*)&addrDest, sizeof(addrDest));