socket编程-socket地址API
socket地址API的一些解析
socket地址结构体
struct sockaddr_in{
sa_family_t sin_family; /*地址族*/
u_int16_t sin_port; /*端口*/
struct in_addr sin_addr; /*IPv4地址结构体*/
}
struct in_addr{
u_int32_t s_addr; /*IPv4地址,要使用网络序表示*/
}
主机字节序和网络字节序
现代CPU的累加器一次能够装载4个字节(在32位机下),这4个字节在内存中的顺序影响它被累加器装载成的整数的值,也就是字节序问题。大端字节序是指一个整数的高位字节(23~31bit)存放在内存的低地址处,而小端字节序则是将整数的高位字节存放在内存的高地址处。现代PC大多采用小端字节序,因此小端字节序又被称为主机序。发送端总是把要发送的数据转化成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字
节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换),因此大端字节序也称为网络字节序。Linux提供下列函数完成主机序和网络序的转换:
htons() & ntohs()
函数原型:
unsigned short int htons(unsigned short int hostshort);
//htons的功能:将一个无符号短整型(2个字节)的主机数值转换为网络字节顺序
unsigned short int ntohs(unsigned short int netshort);
//ntohs的功能: 将一个无符号短整型(2个字节)的网络数值转换为主机字节顺序
常见写法:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port); /*端口号,主机字节序转网络字节序*/
inet_aton(ip,&addr.sin_addr); /*IPv4地址,主机序要转换为网络字节序*/
/*......*/
int port = ntohs(addr.sin_addr);
printf("%d",port);
htonl() & ntohl()
函数原型:
unsigned long int htonl(unsigned long int hostlong);
//htonl的功能:将一个无符号长整型(4个字节)的主机数值转换为网络字节顺序
unsigned long int ntohl(unsigned long int netlong);
//ntohl的功能: 将一个无符号长整型(4个字节)的网络数值转换为主机字节顺序
IP转换函数
inet_ntoa()
inet_ntoa函数原型:
char * inet_ntoa(struct in_addr in);
//inet_ntoa的功能:将网络字节序表示的IPv4地址转换为用点分十进制字符串表示的IP地址,形如"a.b.c.d",若转换失败返回NULL。
由于返回静态指针,故每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。所以如果要连续调用不能拷贝指针,而是要用strcpy保存。
常见写法:
struct sockaddr_in addr;//地址
......
// "ntoa" ="net to ascii"
printf_s("the IP is [%s:%d]\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
...
inet_addr() & inet_aton()
inet_addr函数原型:
in_addr_t inet_addr(const char* cp);
//inet_addr()的功能是将字符串形式的IP地址("a.b.c.d")转换为按网络字节序整数表示的IPv4地址,失败时返回INADDR_NONE
int inet_aton(const char *cp,struct in_addr*inp);
常见写法:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port); /*端口号,主机字节序转网络字节序*/
inet_aton(ip,&addr.sin_addr); /*IPv4地址,主机序要转换为网络字节序*/
//或者用这句 addr.sin_addr = inet_addr(ip);
inet_aton()其完成的功能和inet_addr()相同,就是会将结果保存在inp指向的结构体中,成功返回1,失败返回0

浙公网安备 33010602011771号