套接字编程:struct sockaddr VS struct sockaddr_in

时间:2015-04-15 11:44:56

标签: c++ linux sockets struct

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

struct sockaddr_un v/s sockaddr - C(Linux)

但我仍然不清楚sockaddr_in和sockaddr之间的区别是什么,每个套接字方法/函数I.ebin,connect,似乎使用sockaddr而不是sockaddr_in,这些结构是否可以互换?如果只使用sockaddr那么为什么有_in?我更喜欢_in似乎更详细和有序。

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

大多数时候第3个参数是addr_len用于快速区分ipv4和ipv6吗?

2 个答案:

答案 0 :(得分:3)

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)套接字/地址系列的最大大小,以便它可以容纳所有支持的地址。

答案 1 :(得分:0)

看一下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)];
  };

如果我们看到sockaddr

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

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

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