Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 套接字编程:结构sockaddr VS结构sockaddr\u in_C++_Linux_Sockets_Struct - Fatal编程技术网

C++ 套接字编程:结构sockaddr VS结构sockaddr\u in

C++ 套接字编程:结构sockaddr VS结构sockaddr\u in,c++,linux,sockets,struct,C++,Linux,Sockets,Struct,我看到了下面类似的问题: 但是我仍然不清楚sockaddr_in和sockaddr之间的区别,每个socket方法/函数,即bind、connect,似乎使用sockaddr而不是sockaddr_in,这些结构是可互换的吗?如果只使用sockaddr,那么为什么一个中有_?我更喜欢看起来更详细、更有条理的 如果我违反了任何规则,请删除帖子;( 大多数情况下,第三个参数是addr\u len。这是用来快速区分ipv4和ipv6的吗?请查看中的sockaddr\u struct sockaddr

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

但是我仍然不清楚sockaddr_in和sockaddr之间的区别,每个socket方法/函数,即bind、connect,似乎使用sockaddr而不是sockaddr_in,这些结构是可互换的吗?如果只使用sockaddr,那么为什么一个中有_?我更喜欢看起来更详细、更有条理的

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


大多数情况下,第三个参数是addr\u len。这是用来快速区分ipv4和ipv6的吗?

请查看中的sockaddr\u

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.  */
  };
所以实际上,它们是不可交换的,但是它们有相同的大小,所以你可以毫无问题地使用它,并在这些结构之间转换


但请记住,您必须知道自己正在做什么,否则可能会出现故障或意外行为。

请查看中的sockaddr\u

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.  */
  };
所以实际上,它们是不可交换的,但是它们有相同的大小,所以你可以毫无问题地使用它,并在这些结构之间转换


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

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

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

sockaddr\u in
是实际的IPv4地址布局(它有
.sin\u port
.sin\u addr
)。UNIX域套接字将具有类型
sockaddr\u un
,并将定义不同的字段,特定于UNIX套接字系列


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

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

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

sockaddr\u in
是实际的IPv4地址布局(它有
.sin\u port
.sin\u addr
)。UNIX域套接字将具有类型
sockaddr\u un
,并将定义不同的字段,特定于UNIX套接字系列


基本上,
sockaddr
是字节的集合,它的大小是所有支持的大小的最大值(由O/s支持)socket/地址族,这样它就可以容纳所有支持的地址。

谢谢,但是既然每个socket方法都使用sockaddr,我就不能使用sockaddr\u-in?既然你说它们不可互换,那么sockaddr\u-in的用途是什么?addr\u-in是用来区分ipv4和ipv6还是用来区分填充o.OThis是假的。这不是这些结构不同的原因,也不是解释它们之间的区别的原因。谢谢,但是既然每个套接字方法都使用sockaddr,我就不能使用sockaddr_?既然你说它们是不可互换的,那么sockaddr_in的用途是什么?addr_len是用来区分ipv4和ipv6还是用于这不是这些结构不同的原因,也不是解释它们之间的区别的原因。很好,现在看起来很完美(拇指支撑)。不,确实不是,thx!但我不想太强调这个事实,因为这是最不相关的答案。很好,现在看起来很完美不,确实不是,谢谢!但我不想太强调这个事实,因为这是答案中最不相关的部分。