套接字编程简介
- 套接字地址结构
- inet_aton、inet_addr和inet_ntoa函数
- inet_pton 和 inet_ntop函数
1、套接字地址结构
ipv4套接字地址结构
<netinet/in.h>
struct in_addr{
in_addr_t s_addr;
}
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_adr sin_addr;
char sin_aero[8];
}
sin_addr 是ip地址
sin_port 是端口号
sin_family 是指具体的协议 套接字地址结构的地址族
通用套接字地址结构
<sys/socket.h>
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
由于套接字函数是在ANSIC之前定义的,没有void*类型的指针,所以在使用某些函数时需要将套接字地址结构强制转化为该结构
IPV6的套接字地址结构
<netinet/in.h>
struct in6_addr{
uint8_t s6_addr[16];
};
#define SIN6_LEN
struct sockaddr_in6 {
uint8_t sin6_len;
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id
};
新的通用套接字地址接结构
<netinet/in.h>
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
};
2、inet_aton、inet_addr和inet_ntoa函数
inet_aton、inet_addr和inet_ntoa在点分十进制数串(206.168.112.96)与它长度为32位的网络字节序二进制值间转换IPV4地址。
#include<arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
char *inet_ntoa(struct in_addr inaddr);
第一个函数inet_aton将strptr所指C字符串转换成一个32位的网络字节序二进制值,并通过指针addrptr来存储。若成功则返回1,否则返回0 inet_addr进行相同的转换,但是当出错时该函数返回INADDR_NONE常值。因为他的二进制值被用来指示该函数失败,inet_ntoa将一个32位网络字节序二进制IPv4地址转换成相应的点分十进制数串
3、inet_pton和inet_ntop函数
#include<arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
family 既可以是AF_INET 也可以是AF_INET6 .第一个函数尝试转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。若成功则返回值为1,否则为0, inet_ntop进行相反的转换。