我在套接字编程中遇到了这个问题:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
这是两个具有不同类型的结构,这就是我被用来使用它们的方式
客户端:
connect(sfd,(struct sockaddr *)&caddr,clen; //type casted one
服务器端:
bind(sfd,(struct sockaddr *)&saddr,slen);
accept(sfd,(struct sockaddr *)&caddr,&clen);
在这里,对具有不同定义的结构进行类型转换,这将如何影响变量?
即使我进行类型转换,我也可以像这样访问变量:
printf("File Descriptor : %d\n", fd);
char *p = inet_ntoa(caddr.sin_addr);
unsigned short port_no = ntohs(caddr.sin_port);
printf("Ip address : %s\n", p);
printf("Ephimeral port : %d\n", port_no);
这种类型转换有什么用?即使我已进行类型转换,也如何访问其他结构的那些成员(此处为addr_in)?
我想知道这些操作是如何发生的,并了解对不同结构进行类型转换的需求。
最佳答案
完美的术语将是“type punning”,而不是将其称为typecasting。
sockaddr_in用于基于IP的通信,其中我们指定协议(protocol)类型,IP地址,端口等,而sockaddr是套接字操作中使用的通用结构。 bind()使用sockaddr,因此需要punning类型。
您可以搜索punning类型并获取更多信息。
关于c - 具有不同定义的类型转换结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40446721/