sockaddr与sockaddr_in 意义

 sockaddr与sockaddr_in 意义


struct sockaddr {
unsigned short int  sa_family; /* address family, AF_xxx */
char sa_data[14];  /* address */
};

sa_family是地址家族,是“AF_xxx”的形式。常设为“AF_INET”,代表InternetTCP/IP)地址族。

sa_data是协议地址,由sa_family决定。如果sa_family=AF_INET,则sa_data就是sockaddr_insin_addrsin_port。换句话说,这时sockaddr可以当作sockaddr_in看。

 

struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /*to make same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};

sin_family意义与sa_family同。
sin_port
存储端口号(使用网络字节顺序)
sin_addr
存储IP地址,使用in_addr这个数据结构
sin_zero
是为了让sockaddrsockaddr_in两个数据结构保持大小相同而保留的空字节。
in_addr结构体中,s_addr按照网络字节顺序存储IP地址。

 

sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr类型时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

为什么定义多个数据结构?

因为UNIXsocket编程提供统一的API接口,无论是UNIX域套接字,还是Internet套接字,只是在调用时传进去的不同的数据结构最后强制转换为 struct  sockaddr * 类型

# define __CONST_SOCKADDR_ARG   __const struct sockaddr *

 

# define  __CONST_SOCKADDR_ARG   __const struct sockaddr *

__restrict关键字是在 C99 中定义的新标准关键字,将视其修饰的变量不与其他变量关联,主要用来提高编译效率。


socket 编程API通用接口:

extern int socket (int __domain, int__type, int __protocol) __THROW;

extern int bind (int __fd,__CONST_SOCKADDR_ARG __addr, socklen_t __len) __THROW;

extern int listen (int __fd, int __n)__THROW;

extern int accept (int __fd, __SOCKADDR_ARG__addr,  socklen_t *__restrict__addr_len);

extern int connect (int __fd,__CONST_SOCKADDR_ARG __addr, socklen_t __len);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值