sockaddr和sockaddr_in的区别

sockaddr

头文件:

#include <sys/socket.h>

数据结构:

struct sockaddr {  
	sa_family_t sin_family;//地址族
	char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息               
}; 

sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了

sockaddr_in

头文件:

#include <netinet/in.h>

数据结构:

struct sockaddr_in {
	short int sin_family;			//地址族
	unsigned short int sin_port;	//端口号
	struct in_addr sin_addr;		//Internet地址
	unsigned char sin_zero[8];		//字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等
};

其中in_addr结构体用于存放一个32位的IPv4地址

struct in_addr {
	in_addr_t s_addr;
};

sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。

sockaddr_in解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中

sockaddr和sockaddr_in的区别

二者长度一样,都是16个字节,因此可以互相转化,从这个意义上说,他们并无区别。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。
sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

以connect函数为例:

/* 
 * connect()用于建立与指定socket的连接
 * int connect(SOCKET s, const struct sockaddr * name, int namelen);
 * s:标识一个未连接socket
 * name:指向要连接套接字的sockaddr结构体的指针
 * namelen:sockaddr结构体的字节长度
 * 若无错误发生,则connect()返回0。否则返回SOCKET_ERROR错误
 */


connect函数的第二个参数要求时sockaddr类型的,使用该函数时需进行如下所示类型转化:

其他函数同理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值