通用的结构体:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
编程时常用的
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;
};
typedef struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
}S_un;
}IN_ADDR;
某些函数调用时的参数必须是指向通用结构体的指针,到时一个强制转换即可
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
char *inet_ntoa(struct in_addr in);
前两个函数分别将字符串形式的IP转换为网络字节序和主机字节序的IP,返回IP结构。
inet_aton将第一个参数字符串形式IP转换成网络字节序IP存入第二个参数 指向IP结构体的指针
inet_ntoa将IP结构体中IP转换成点分式IP字符串并返回。
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
inet_aton("127.0.0.1",&address.sin_addr);
printf("IP is ntoa: %s/n",inet_ntoa(address.sin_addr));
两个通过套接字描述符获取套接字结构的函数
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
把第一个参数文件描述服对应的套接字结构存入第二个参数套接字结构指针所指向的套接字结构体中,第三个参数为指向所获取的套接字结构大小整数的指针,该整数一般为16。
区别在于前者用于获取本地套接字,后者用于远程在客户端调用前者,得到自己的,调用后者得服务器的,在服务器端情况正好相反