gpt4 book ai didi

c - 没有目标端口的 UNIX sendto()

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:37 25 4
gpt4 key购买 nike

我是 unix 套接字编程的新手。我对 unix sendto() 函数有一些疑问。

ssize_t sendto(int sockfd,
const void *buf,
size_t len,
int flags,
const struct sockaddr *dest_addr,
socklen_t addrlen);

我的问题是:

(1)如果dest_addr中没有设置端口号,接收端主机将如何处理数据包?

(2) 这个函数如何处理dest_addr中的信息?我使用此功能发送 IPv6 数据包,我必须使用与 sockaddr_in 结构完全不同的 sockaddr_in6 结构:

struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};

struct sockaddr_in6 {
u_int16_t sin6_family; // address family, AF_INET6
u_int16_t sin6_port; // port number, Network Byte Order
u_int32_t sin6_flowinfo; // IPv6 flow information
struct in6_addr sin6_addr; // IPv6 address
u_int32_t sin6_scope_id; // Scope ID
};

为什么我们需要强制转换以在 sendto() 中构造 sockaddr?看起来只有 sa_family 对这个函数有意义。那么其他领域呢?

最佳答案

关于 1:没有特殊的“未定义”值。无论恰好存储在该内存位置的值都将被视为所需的端口号。

关于 2:每个 struct sockaddr 都以一个地址族标识符开头。如果该系列设置为 AF_INET,则所有函数都知道需要一个 struct sockaddr_in。其他家庭也一样。从这个意义上说,我相信您发布的示例(这似乎暗示 AF_INET6 可以是 struct sockaddr_in 中 sin_family 的有效值)具有误导性。

关于c - 没有目标端口的 UNIX sendto(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com