Mor*_*idt 4 c sockets linux bind
在 C 语言中,bindSocket 的典型方式如下:
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)
{
// Stuff
}
Run Code Online (Sandbox Code Playgroud)
sockaddr_in我想知道为什么从到 的转换sockaddr有效,因为我找不到任何文档说明它为什么有效。似乎每个人都这样做。
为什么类型转换在这里起作用?
我不是问我们为什么要铸造它,这已经在这里得到了回答。我问为什么它有效。
允许将结构指针转换为不同的结构指针并返回。C 标准第 6.3.2.3p7 节对此进行了详细说明:
指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐,则行为未定义。否则,当再次转换回来时,结果应等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向该对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象的剩余字节的指针。
上述段落中有一个关于对齐的限制,第 6.2.5p28 节对此进行了进一步详细说明:
指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。48) 类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针应具有相同的表示和对齐要求。所有指向联合类型的指针应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。
据推测,该bind函数知道它具有哪种套接字描述符并将其转换struct sockaddr *回struct sockaddr_in *.