是否有可能投结构到另一个?(Is it possible to cast struct to ano

2019-06-25 11:01发布

任何一个可以描述如何(struct sockaddr *)&server在这里工作? 是否有可能投下更大的结构,以更小的结构?

看到这些结构:

// IPv4 AF_INET sockets:
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 in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

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

这是主要的程序:

int main(int argc , char *argv[])
 {
        int socket_desc;
        struct sockaddr_in server;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }

    server.sin_addr.s_addr = inet_addr("74.125.235.20");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    //Connect to remote server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");
    return 0;
}

Answer 1:

这是refered为类型双关 。 在这里,无论是结构具有相同的大小,所以没有结构大小的问题。 虽然你可以投,几乎什么东西,与结构做起来容易出错。



Answer 2:

这是“传承”的C'S形式(注意引号)。 这工作,因为C不关心地址的基础数据,正是你所说的那样的。

功能决定了它的结构实际上是使用上sa_family的领域,并铸造成正确的sockaddr_in里面的功能。



Answer 3:

你可以投sockaddr_in的指向sockaddr,但你通常不能施放任何结构的任何其他并假设事情会正常工作。



Answer 4:

在C,有可能投什么东西。 你甚至可以省略剧组到(结构sockaddr *),并且可能只是得到一个编译器警告。



文章来源: Is it possible to cast struct to another?