IPV4套接口地址结构以“sockaddr_in”命名
sockaddr_in(在<netinet/in.h>中定义):
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;
};
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
/*****************************************************************************/
struct sockaddr_in servaddr;
int sockfd;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Socket error: %s\n", sterror(errno));
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/*****************************************************************************/
当作为参数传递给任何一个套接口函数时,套接口地址结构总是通过指针来传递,但通过指针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址结构。
有一个问题是如何声明所传递指针的数据类型。ANSI C中有很简单的解决把法:它有通用的指针类型 void * 。但是,套接口函数是在ANSI C之前定义的,1982年采用了这样的一个办法:在<sys/socket.h>头文件中定义一个通用的套接口地址结构:
struct sockaddr {
unsigned short sa_family; /* 地址家族,一般都是“AF_xxx”的形式。通常大多 用的是都是AF_INET*/
char sa_data[14]; /* 14字节协议地址*/
};
于是,套接口函数被定义为采用指向通用套接口地址结构的指针。这要求对这些函数的任何调用都必须将指向特定协议的套接口地址结构的指针类型转化成指向通用套接口地址结构的指针。(bind、connect、recvfrom、sendto)。
/*****************************************************************************/
struct sockaddr_in servaddr;
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))
/*****************************************************************************/
sockaddr_in 中的成员struct in_addr sin_addr 表示32位的IP地址。但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr 表示之间转换。
/*****************************************************************************/
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
int inet_pton(int family, const char *strptr, void *addrptr);
/*****************************************************************************/