sockaddr和sockaddr_in的区别

时间:2022-09-11 19:09:25

  套接字编程需要指定套接字的地址作为参数,不同的协议族有不同的地址结构定义方式。这些地址结构通常以sockeaddr_开头,每一个协议族有一个唯一的后缀,例如对于以太网,其结构名称为sockaddr_in.

 1.通用套接字数据结构

    通用的套接字地址类型的定义如下,它可以在不同协议族之间进行强制转换。

include <netinet/in.h>  

struct sockaddr {
unsigned short sa_family; // 2 bytes address family, AF_xxx unsiged short
char sa_data[14]; // 14 bytes of protocol address
};
    在网络程序设计中所使用的函数中几乎所有的套接字函数都用这个结构作为参数,例如bin()函数的原型为:

int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen)
  2.实际使用的套接字数据结构

    在使用结构struct sockaddr 不方便进行设置,在以太网设置,在以太网中,一般使用结构struct sockaddr_in进行设置,这个结构如下所示:

struct sockaddr_in {  
short sin_family; // 2 bytes e.g. AF_INET, AF_INET6
unsigned short sin_port; // 2 bytes e.g. htons(3490)
struct in_addr sin_addr; // 4 bytes see struct in_addr, below
char sin_zero[8]; // 8 bytes zero this if you want to
};

struct in_addr {
unsigned long s_addr; // 4 bytes load with inet_pton()
};

 3. sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:
程序员不应操作sockaddr,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

sockaddr和sockaddr_in的区别

 4.一般的用法为:

   程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数

网络编程中一段典型的代码为:

int sockfd;  
struct sockaddr_in servaddr;

sockfd = Socket(AF_INET, SOCK_STREAM, 0);

/* 填充struct sockaddr_in */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

/* 强制转换成struct sockaddr */
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));