sockaddr和sockaddr_in的区别

sockaddr是在头文件 /usr/include/bits/socket.h 中定义

 

struct sockaddr
{
<span style="white-space:pre">	</span>__SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  协议族*/
<span style="white-space:pre">	</span>char sa_data[14];       /* Address data.  地址+端口号*/
};

sockaddr_in是在头文件 /usr/include/netinet/in.h 中定义的

 

 

/* Structure describing an Internet socket address.  */
struct sockaddr_in
{
	__SOCKADDR_COMMON (sin_);           /* 协议族 */
	in_port_t sin_port;         /* Port number. 端口号 */
	struct in_addr sin_addr;        /* Internet address. IP地址 */
	 
	/* Pad to size of `struct sockaddr'.  用于填充的0字节 */
	unsigned char sin_zero[sizeof (struct sockaddr) -
	__SOCKADDR_COMMON_SIZE -
	sizeof (in_port_t) -
	sizeof (struct in_addr)];
};
 
/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr
{
	in_addr_t s_addr;
};

 

 

二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。

sockaddr_in 是internet环境下套接字的地址形式。

所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sockaddr和sockaddr_in都是网络编程中的结构体,用于表示网络地址。 sockaddr是通用的网络地址结构体,包含以下成员: - sa_family:地址族,表示地址类型,如AF_INET表示IPv4地址,AF_INET6表示IPv6地址。 - sa_data:地址数据,具体内容根据地址族不同而不同。 sockaddr_in是IPv4地址结构体,是sockaddr的一种具体实现,包含以下成员: - sin_family:地址族,固定为AF_INET。 - sin_port:端口号,使用网络字节序表示。 - sin_addr:IPv4地址,使用网络字节序表示。 - sin_zero:填充字节,保证sockaddr_in和sockaddr大小相同。 在网络编程中,通常使用sockaddr_in来表示IPv4地址,而sockaddr则用于通用的地址转换。 ### 回答2: sockaddr和sockaddr_in都是用来表示socket地址的结构体。但是它们有着不同的作用和使用方式。 sockaddr是一个通用的socket地址结构体,它定义在<sys/socket.h>文件中,有以下成员: struct sockaddr { unsigned short sa_family; // 地址族,如AF_INET char sa_data[14]; // 地址信息,如ip地址和端口号 }; 可以看到,该结构体只有两个成员变量,其中一个是地址族,指定地址类型,如AF_UNIX表示UNIX本地域套接字,AF_INET表示IPv4协议套接字;另一个是地址信息,包括IP地址和端口号。这个结构体的设计是为了适用于不同的地址类型,也就是说,该结构体的目的是为了支持通用的套接字通信方式。 而sockaddr_in是用来表示IPv4地址的结构体,定义在<netinet/in.h>文件中,有以下成员: struct sockaddr_in { short int sin_family; // 地址族,如AF_INET unsigned short int sin_port; // 端口号 struct in_addr sin_addr; // IP地址 unsigned char sin_zero[sizeof(struct sockaddr) - sizeof(unsigned short int) - sizeof(struct in_addr)]; // 填充 }; 相较于sockaddr,sockaddr_in多了一个成员变量sin_addr,用来存放IPv4地址。此外,sockaddr_in还包含一个没有名称的填充成员,保证结构体大小与sockaddr相等,以方便套接字地址的强制类型转换。 总的来说,sockaddr是用来表示套接字地址的通用结构体,支持多种地址类型,而sockaddr_in则是用于表示IPv4地址的结构体,它是sockaddr的一个子集。在实际编程中,一般使用sockaddr_in来表示IPv4地址,以方便操作。当需要支持多种地址类型时,可以使用sockaddr类型。 ### 回答3: sockaddr和sockaddr_in都是用于表示网络地址的数据结构,但它们有一些差别。 sockaddr是通用的网络地址结构体,可以用于所有的网络地址族,如IPv4、IPv6以及其他的地址族。其定义如下: ``` struct sockaddr { sa_family_t sa_family; // 地址族 char sa_data[14]; // 具体地址信息 }; ``` 其中,`sa_family`用于表示地址族,`sa_data`用于存储具体的地址信息。 sockaddr_in是为IPv4设计的网络地址结构体,其定义如下: ``` struct sockaddr_in { sa_family_t sin_family; // 地址族 unsigned short sin_port; // 端口号 struct in_addr sin_addr; // IPv4地址 char sin_zero[8]; // 保留字节 }; ``` 其中,`sin_family`也用于表示地址族,`sin_port`用于存储端口号,`sin_addr`用于存储IPv4地址,`sin_zero`保留8个字节,以便在未来扩展。 因此,我们可以看出,sockaddr_in比sockaddr多了一个存储IPv4地址和端口号的字段,因为IPv4是目前使用最广泛的网络地址族,因此sockaddr_in也是使用最为广泛的网络地址结构体之一。 在实际编程中,我们通常会使用sockaddr_in结构体来表示IPv4地址及端口号,但由于某些原因(如网络安全),有些情况下也可能需要使用更通用的sockaddr结构体来表示网络地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值