Chinaunix首页 | 论坛 | 博客
  • 博客访问: 583180
  • 博文数量: 199
  • 博客积分: 5087
  • 博客等级: 大校
  • 技术积分: 2165
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 21:53
文章存档

2010年(199)

我的朋友

分类: LINUX

2010-06-18 18:12:56

Linux]sockaddr与sockaddr_in Posted on 2009-09-12 09:11 gshine 阅读(379) 评论(0)  编辑 收藏 所属分类: 软件开发

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

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

sa_data是协议地址,由sa_family决定。如果sa_family=AF_INET,则sa_data就是sockaddr_in的sin_addr和sin_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是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
在 in_addr结构体中,s_addr按照网络字节顺序存储IP地址。

 

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

(注:这条是不是针对sa_family为AF_INET时才成立呢?感觉sockaddr_in就是针对sa_family=AF_INET时使用的套接字结构,而sockaddr更像是一个通用的套接字结构,呵呵,从字面上看出的,不知正确否……)

转自:http://www.cnblogs.com/gaojing/archive/2009/09/12/1565121.html

阅读(1332) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~