我在下面看到了类似问题的问题:
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吗?
答案 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. */
};
实际上,它们不是可交换的,但它们具有相同的大小,因此您可以毫无问题地使用它并在这些结构之间进行转换。
但请记住,您必须知道自己在做什么,或者可能会遇到段错误或意外行为。