+-
为什么从sockaddr_in到sockaddr的转换工作
在C中,绑定Socket的典型方法是以下方式:

int server_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
int port_number = 55555;

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port_number);

int result = bind(server_socket_fd,(struct sockaddr *)&addr , sizeof(addr));
if(bind_result > 0)
{
    //
}

我想知道为什么从sockaddr_in到sockaddr的演员表工作,因为我找不到任何文档,为什么它的工作原理.
似乎每个人都这样做.

为什么类型转换在这里工作?

我不是在问为什么我们施展它,这已经回答了here.我在问为什么它有效.

最佳答案
sockaddr结构基本上只有一个字段,即地址族.接收此结构的代码可以使用此字段来确定结构的实际类型.所有真正使用的结构也都将此字段作为第一个,因此该值是确定性的.

这些实现还使结构与填充相同,因此内存使用也是完全确定的.这使它工作正常.

例如,Microsoft将Visual Studio 2017中的sockaddr结构定义为

struct sockaddr {  
    unsigned short sa_family;  
    char sa_data[14];  
};

sa_data
Maximum size of all the different socket address structures.

因此,任何可能发送的“子”结构都必须包含14个字节的数据,不多或少.

而sockaddr_in是

struct sockaddr_in{  
    short sin_family;  
    unsigned short sin_port;  
struct in_addr sin_addr;  
    char sin_zero[8];  
};

这里端口和in_addr总共需要六个字节,因此使用8个字节的填充来保持大小与sockaddr相同.

当然可以创建例如sockaddr_un,设置它的地址族来声明它的sockaddr_in,并且接收该结构的任何代码都会将它转换为错误并获得完全错误的值.

点击查看更多相关文章

转载注明原文:为什么从sockaddr_in到sockaddr的转换工作 - 乐贴网