Tabla de contenido
1. La estructura de la estructura sockaddr_in
2. Generalmente, la estructura que escribimos
3. Interfaz de conversión común de "decimal punteado" a "uint32_t"
3.1. inet_aton y inet_ntoa (ipv4)
3.2 inet_pton e inet_ntop (ipv4 e ipv6)
3.4 La diferencia entre inet_addr e inet_network e inet_aton
1. La estructura de la estructura sockaddr_in
2. Generalmente, la estructura que escribimos
Generalmente, usamos la notación decimal con puntos en el programa para indicar que IP es una cadena.
- estándar::cadena IP = "127.0.0.1";
- uing16_t PUERTO = 8080;
Finalmente, debe completarse en la estructura sockaddr_in cuando se envía a través de la red.
3. Interfaz de conversión común de "decimal punteado" a "uint32_t"
inet_aton, inet_ntoa, inet_pton e inet_ntop son funciones que se utilizan para convertir direcciones IP (decimales con puntos) en números binarios en orden de bytes de red big-endian
La diferencia es que inet_aton e inet_ntoa solo admiten el tipo de traducción de direcciones ipv4, mientras que inet_pton e inet_ntop admiten el tipo de traducción de direcciones ipv4 e ipv6
3.1. inet_aton y inet_ntoa (ipv4)
Prototipo de función:
#include<sys/scoket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
//说明
用来将参数cp所指的ipv4点分十进制网络地址字符串转换成网络使用的大端字节序二进制数字,
然后存于参数inp所指的in_addr结构中。
成功则返回非0值,失败则返回0。
//struct in_addr定义为:
struct in_addr
{
unsigned long int s_addr;//32位的unsigned int 类型
};
char *inet_ntoa(struct in_addr in);
//说明
用来将参数in所指的大端网络字节序二进制的数字转换成ipv4点分十进制字符串网络地址
然后将指向此网络地址字符串的指针返回。
成功则返回字符串指针,失败则返回NULL。
3.2 inet_pton e inet_ntop (ipv4 e ipv6)
#include <sys/socket.h>
#include <netinet/in.h>
#include<arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
//说明
用来将ipv4或者ipv6类型的ip地址(点分十进制)字符串转换为大端网络字节序二进制数字,
第一个参数af是地址簇,取值为AF_INET(表示ipv4使用的地址簇)和AF_INET6(表示ipv6使用的地址簇),
第二个参数src是来源地址,(ip点分十进制字符串)
第三个参数 dst接收转换后的数据。(大端网络字节序二进制数字)
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
说明:
将大端网络字节序二进制数转换为ipv4或者ipv6类型的字符串,
第一个参数af是地址簇,取值为AF_INET(表示ipv4使用的地址簇)和AF_INET6(表示ipv6使用的地址簇)
第二个参数src为32位的IP地址。(大端网络字节序二进制数字)
第三个参数dst指向存放转化字符串的缓冲区。
第四个参数cnt他是所指向缓存区dst的大小
3.3. inet_addr y inet_network
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
这个接口很简单就是把 点分IP 转化为 网络IP 以返回值的形式返回。
但是
inet_addr 返回的网络IP 是网络字节序(大端)
inet_network返回的网络IP 是主机字节序(未知大小端)
3.4 La diferencia entre inet_addr e inet_network e inet_aton
三者的作用:
都是将点分IP转换为二进制IP。
三者原型:
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
头文件:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
区别:
inet_aton计算出来的是网络字节序的二进制IP
inet_network计算出来的是主机字节序的二进制IP
inet_addr计算出来的是网络字节序的二进制IP
那inet_aton和inet_addr有什么区别呢?
inet_addr不支持255.255.255.255,inet_aton支持255.255.255.255