套接字编程:结构 sockaddr VS 结构sockaddr_in



>我在下面看到了类似的问题:

struct sockaddr_un v/s sockaddr - C(Linux)

但我仍然非常不清楚 sockaddr_in 和 sockaddr 之间有什么区别,每个套接字方法/函数即绑定、连接,似乎使用 sockaddr 而不是sockaddr_in,这些结构可以互换吗? 如果只使用sockaddr,那么为什么有_in的呢?我更喜欢_in看起来更详细和有序。

如果我违反了任何规则,请删除帖子;(

大多数情况下,第三个参数是用于快速区分IPv4和IPv6 addr_len?

sockaddr 是一个通用套接字地址。如果您还记得,您可以通过相同的操作系统 API - socket() 创建 TCP/IPv4、UDP/IPv4、UNIX、TCP/IPv6、UDP/IPv6 套接字(以及更多!

所有这些不同的套接字类型都有不同的实际地址 - 由不同的字段组成。

sockaddr_in实际的IPv4地址布局(它具有.sin_port.sin_addr)。UNIX 域套接字将具有类型 sockaddr_un 并且将定义特定于 UNIX 套接字系列的不同字段。

基本上sockaddr是字节的集合,它的大小是所有支持的(由 O/S)套接字/地址系列的最大大小,以便它可以容纳所有支持的地址。

看看sockaddr_in

struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;         /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */
    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
               __SOCKADDR_COMMON_SIZE -
               sizeof (in_port_t) -
               sizeof (struct in_addr)];
  };

如果我们看到袜子

* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];       /* Address data.  */
  };

所以实际上,它们是不可交换的,但它们具有相同的大小,因此您可以毫无问题地使用它并在这些结构之间铸造。

但请记住,您必须知道自己在做什么,否则可能会遇到段错误或意外行为。

最新更新