struct sockaddr与struct sockaddr_in的区别和联系

来源:互联网 发布:linux没有rpm命令 编辑:程序博客网 时间:2024/05/17 00:15
一、struct sockaddr:在linux环境下,该结构体在/usr/include/linux/socket.h中定义,具体如下:
struct sockaddr {
unsigned short sa_family;  /* 地址族, AF_xxx */
char sa_data[14];  /* 14字节的协议地址*/
};

二、struct sockaddr_in:在linux环境下,结构体struct sockaddr_in在/usr/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]; /* 与struct sockaddr一样的长度 */

};

struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。

通常的用法是:
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
my_addr.sin_family = AF_INET; /* 主机字节序 */
my_addr.sin_port = htons(MYPORT); /* short, 网络字节序 */
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
//memset(&my_addr.sin_zero, 0, 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

你只要记住,填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。


转自:http://www.cnblogs.com/hnrainll/archive/2011/04/24/2026432.html