-2

我是 C++ 新手,可以对以下句子进行一些澄清:

“指向 struct sockaddr_in 的指针可以转换为指向 struct sockaddr 的指针,反之亦然。因此,即使 connect() 需要 struct sockaddr*,您仍然可以使用 struct sockaddr_in 并在最后一分钟进行转换!”

这句话是什么意思?

4

1 回答 1

1

假设你有

struct sockaddr_in *var;

你有

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

你可以做:

connect(fd, (struct sockaddr *) var, addrlen);

这是因为那些函数族并不总是接收 sockaddr_in,它们可以接收,例如 sockaddr_in6。因此,您可以将两个指针都转换为 sockaddr 并且它们会起作用。

如何?认为这些结构的第一个字段是相同的,如果将它们强制转换为 sock_addr 您仍然可以读取第一个字段而没有未定义的行为,然后将它们作为该字段定义的特定结构处理。

struct sockaddr {
    unsigned short    sa_family;    // address family, AF_xxx
    char              sa_data[14];  // 14 bytes of protocol address
};

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
};

sa_family 字段将与 sin_family 字段相同,因此您可以在转换之前知道它是 AF_INET 还是 AF_INET6。

于 2013-09-19T08:28:32.007 回答