c - 具有不同定义的类型转换结构

标签 c sockets struct posix tcp-ip

我在套接字编程中遇到了这个问题:

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/

相关文章:

c - while 循环的错误输出

perl - 无法检测 $sock->connected() 的关闭连接

c# - unity3d 中的套接字出现问题

python - 套接字连接在 3 次迭代后中止 - python

c - 在 C 中反转字符串的最快方法

c++ - 将代码从 C 转换为 C++ 时无法理解错误消息

c - 使用指定的初始值设定项来初始化结构中的二维字符数组初始值设定项会在 VS2013 中发出错误 C2078

c - "malloc(sizeof(struct a *))"和 "malloc(sizeof(struct a))"是一样的吗?

go - go中动态调用模型

c - 链接库中的函数在可执行文件中看不到