首页 文章

UNIX sendto()没有目标端口

提问于
浏览
2

我是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 回答

  • 1

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

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

相关问题