侧边栏切换

sockaddr_in中sin_zero的意义,以及sockaddr_in sockaddr in_addr区别联系

最后编辑于: 2012-05-01 23:16  |  分类: linux  |  标签: socket   |  浏览数: 888  |  评论数: 0


struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol 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]; // Same size as struct sockaddr
};

struct in_addr {
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};

在in_addr结构体中,s_addr按照网络字节顺序存储IP地址。

sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。

指向sockaddr_in的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr类型时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

想来你是要进行网络编程,使用socket, listen, bind等函数。你只要记住,填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长


上一篇: min()的宏定义中的(void) (&_x == &_y)的含义

下一篇: 一个不错的shell脚本教程