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_in和struct 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地址
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux的基础知识——网络字节序转化,ip地址转换函数,sockaddr数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客14607 递推(矩阵快速幂构造)
- 下一篇: 操作系统——进程