我是unix socket编程的新手。我对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_in6结构,这与sockaddr_in结构完全不同:
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对此函数有意义。那么其他领域呢?
答案 0 :(得分:1)
关于1:没有特殊的“未定义”值。无论发生在该存储器位置的任何值都将被视为所需的端口号。
关于2:每个struct sockaddr都以地址族标识符开头。如果将族设置为AF_INET,则所有函数都将知道期望结构sockaddr_in。同样适用于其他家庭。从这个意义上讲,我相信你发布的例子(这似乎意味着AF_INET6可能是struct sockaddr_in中sin_family的有效值)具有误导性。