C++ 套接字编程:结构sockaddr VS结构sockaddr\u in
我看到了下面类似的问题: 但是我仍然不清楚sockaddr_in和sockaddr之间的区别,每个socket方法/函数,即bind、connect,似乎使用sockaddr而不是sockaddr_in,这些结构是可互换的吗?如果只使用sockaddr,那么为什么一个中有_?我更喜欢看起来更详细、更有条理的 如果我违反了任何规则,请删除帖子;(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
大多数情况下,第三个参数是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!但我不想太强调这个事实,因为这是最不相关的答案。很好,现在看起来很完美不,确实不是,谢谢!但我不想太强调这个事实,因为这是答案中最不相关的部分。