UNIX sendto()没有目标端口

时间:2015-06-25 00:07:00

标签: c sockets unix

我是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对此函数有意义。那么其他领域呢?

1 个答案:

答案 0 :(得分:1)

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

关于2:每个struct sockaddr都以地址族标识符开头。如果将族设置为AF_INET,则所有函数都将知道期望结构sockaddr_in。同样适用于其他家庭。从这个意义上讲,我相信你发布的例子(这似乎意味着AF_INET6可能是struct sockaddr_in中sin_family的有效值)具有误导性。