网络学习四

套接字编程简介

  • 套接字地址结构
  • inet_aton、inet_addr和inet_ntoa函数
  • inet_pton 和 inet_ntop函数

1、套接字地址结构

ipv4套接字地址结构


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 是指具体的协议 套接字地址结构的地址族

通用套接字地址结构


struct sockaddr{
  uint8_t          sa_len;
  sa_family_t  sa_family;
  char             sa_data[14];
}

由于套接字函数是在ANSIC之前定义的,没有void*类型的指针,所以在使用某些函数时需要将套接字地址结构强制转化为该结构

IPV6的套接字地址结构


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
};

新的通用套接字地址接结构


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
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
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进行相反的转换。

你可能感兴趣的:(网络学习四)