linux的基础知识——网络字节序转化,ip地址转换函数,sockaddr数据结构

1.网络字节序

TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节。为了使网络程序具有可移植性,使得同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include<arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h:host;n:network;l:32位长整数;s:16位短整数

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动的返回。

2.IP地址转换函数

2.1 将IP地址转换为网络字节序
#include<arpa/inet.h>
int inet_pton(int af,const char *src,void *dst);

功能:将IPv4地址转换为网络字节序
参数:af:AF_INET或者AF_INET6,前一个是个IPv4地址,后一个适合IPv6地址;src:点分十进制的字符串;dst:写进网络字节序

2.2 将网络字节序转换为IP地址
#include<arpa/inet.h>
int inet_ntop(int af,const void *src,char *dst,socklen_t size);

功能: 将网络字节序转换为IP地址
参数::af:AF_INET或者AF_INET6,前一个是个IPv4地址,后一个适合IPv6地址;src:网络字节序;dst:返回字符串的指针的地址;size:字符串的大小

3.sockaddr数据结构

struct sockaddr很多网络编程函数诞生于IPv4协议之前,那时候都是使用struct sockaddr结构体,但是这个结构体逐渐被废弃,原struct sockaddr演变成struct sockaddr_instruct sockaddr_in6,但是很多函数内部仍然需要传递struct sockaddr的地址,所以我们需要强制转换所需的地址类型。

  struct sockaddr_in {
    
    
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */
           };
  struct in_addr {
    
    
               uint32_t       s_addr;     /* address in network byte order */
           };

参数:sin_family::AF_INET或者AF_INET6;sin_port:端口号;sin_addr:IP地址

猜你喜欢

转载自blog.csdn.net/zxr916/article/details/111321526