Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将struct强制转换为另一个?_C_Sockets_Casting_Struct - Fatal编程技术网

是否可以将struct强制转换为另一个?

是否可以将struct强制转换为另一个?,c,sockets,casting,struct,C,Sockets,Casting,Struct,任何人都可以在这里描述(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_a

任何人都可以在这里描述
(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;
}
intmain(intargc,char*argv[])
{
内部插座描述;
服务器中的结构sockaddr_;
//创建套接字
socket\u desc=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字描述==-1)
{
printf(“无法创建套接字”);
}
server.sin_addr.s_addr=inet_addr(“74.125.235.20”);
server.sinu family=AF\u INET;
server.sin_port=htons(80);
//连接到远程服务器
if(connect(socket_desc,(struct sockaddr*)&server,sizeof(server))<0
{
puts(“连接错误”);
返回1;
}
看跌期权(“关联”);
返回0;
}

这被称为。在这里,两个结构具有相同的大小,因此不存在结构大小的问题。尽管您可以将几乎任何内容强制转换为任何内容,但使用结构很容易出错。

您可以将sockaddr\u强制转换为sockaddr,但您通常不能将任何结构强制转换为任何其他结构,并假定这些结构都能正常工作。

这是C的“继承”形式(请注意引号)。这是因为C不关心地址中的底层数据,而只关心将其表示为什么


该函数通过使用sau family字段,并将其强制转换到函数内部适当的
sockaddr\u中来确定其实际结构。

在C中,可以将任何内容强制转换为任何内容。您甚至可以省略对(struct sockaddr*)的强制转换,可能只是得到一个编译器警告。

connect()函数如何访问存储在
struct in_addr
中的inet_地址?类似于
((struct sockaddr_in*)server->sin addr.s_addr)
printf(“addr:%d\n”,((struct sockaddr_in*)server->sin addr.s_addr));将产生此错误:socket.c:50:54:error:'->'的类型参数无效(包含'struct sockaddr_')为什么?我的问题解决了。谢谢((struct sockaddr_in*)服务器)->sin_addr.s_addr相关||