Linux 網路之IP轉換

2021-07-03 07:08:14 字數 4111 閱讀 6118

乙個ip位址是有小數點分開的十進位制數表示的,我們稱為點分十進位制表示法。其中每乙個十進位制數代表乙個位元組的無符號數值(按照網路位元組序)因為每個位元組都是無符號的8位數值,這就限制了每乙個位元組所能表示的範圍是0~255。

特殊的ip

in_addr_t inet_addr(const char *string);

這個函式使用string作為輸入引數,並將這個點分十進位制的ip位址轉換為按網路位元組序的整形值。函式成功後返回二進位制的網路位元組序的ip位址(struct in_add),否則返回inaddr_none(-1)。

示例:

#include #include #include int main(int argc, char *argv)

if( (addr.s_addr = inet_addr(argv[1])) == -1)

else

return 0;

}注意:如果ip位址為 255.255.255.255 。那麼呼叫 inet_addr() 函式後返回 -1 (因為 -1 的補碼形式是 0xffffffff)。所以不建議使用 inet_addr() 函式。而使用 inet_aton() 函式。

int inet_aton(const char *string, strcut in_addr *addr);將 string 中儲存的點分十進位制字串型別的ip位址轉換為二進位制的ip位址,轉換後的值儲存在指標 addr 指向的結構 struct in_addr 中。函式執行成功返回非0值,失敗返回0。

示例:

#include #include #include int main(int argc, char *argv)

struct in_addr addr;

if(inet_aton(argv[1],&addr) != 0)

fprintf(stdout,"%u\n",addr.s_addr);

else

fprintf(stdout,"%s invalid address\n",argv[1]);

return 0;

}

char *inet_ntoa(strcut in_addr addr);將32位的二進位制ip位址轉換為點分十進位制字串形式。函式執行成功則返回字串,失敗返回null。

#include #include #include int main(int argc, char *argv)

struct in_addr addr;

if(inet_aton(argv[1],&addr) == 0)

printf("%s\n",inet_ntoa(addr));

return 0;

}

in_addr_t inet_network(const char *str);將引數 str 執行的字串形式的網路位址轉換為主機位元組序的二進位制ip位址(無視大小端)。執行成功返回轉換後的結果,失敗返回-1。

示例:

#include #include #include #include int main(int argc, char *argv)

struct in_addr addr;

if ((addr.s_addr = inet_network(argv[1])) == -1)

else

return 0;

}

in_addr_t inet_lnaof(struct in_addr addr);從引數 addr 中提取主機位址,執行成功返回主機位元組序形式的主機位址。

如: 192.168.1.1 屬於c類位址,則主機位址為 1 。

示例:

#include #include #include #include int main(int argc, char *argv)

struct in_addr addr;

if ((addr.s_addr = inet_network(argv[1])) == -1)

addr.s_addr = htonl(addr.s_addr);

fprintf(stdout,"0x%x \n",inet_lnaof(addr));

return 0;

}

in_addr_t inet_netof(struct in_addr addr);從引數 addr 中提取網路位址,執行成功返回主機位元組序形式的網路位址。

如: 192.168.1.1 屬於 c 類位址,則網路位址為 0x c0a801。

示例:

#include #include #include #include int main(int argc, char *argv)

struct in_addr addr;

if ((addr.s_addr = inet_network(argv[1])) == -1)

printf("0x%x\n",addr.s_addr);

addr.s_addr = htonl(addr.s_addr);

fprintf(stdout,"0x%x \n",inet_netof(addr));

return 0;

}

struct in_addr inet_makeaddr(int net, int host);將主機位元組序的網路位址 net 和 主機位址 host 合併成乙個網路位元組序的ip位址。

示例:

#include #include #include #include int main(int argc, char *argv)

struct in_addr addr, addr_1;

if ((addr.s_addr = inet_network(argv[1])) == -1)

addr.s_addr = htonl(addr.s_addr);

uint32_t net = inet_netof(addr);

uint32_t host = inet_lnaof(addr);

addr_1 = inet_makeaddr(net,host);

printf("0x%x \n",htonl(addr_1.s_addr));

return 0;

}

主機序和網路序:不同的cpu有不同的自己序型別,這些位元組序是指整數在記憶體中儲存的順序,這個叫做主機序,最常見的有兩種:網路位元組序是 tcp/ip 中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組序採用 big endian 排序方式。

位元組序轉換函式:

uint32_t htonl(uint32_t hostlong);

把 hostlong 從主機序轉換到網路序。

uint16_t htons(uint16_t hostshort);

把 hostshort 從主機序轉換到網路序。

uint32_t ntohl(uint32_t netlong);

把 netlong 從網路序轉換到主機序。

uint16_t ntohs(uint16_t netshort);

把netshort 從網路序轉換到主機序。

網路IP轉換函式

src.sin addr.s addr inet addr 構建網路位址。printf s n inet ntoa src.sin addr 將網路位址轉換成字串。注意 inet ntoa存在的問題是inet ntoa的返回值是乙個static型別的char 指標,所以會出現問題 char a1,a...

linux網路基本之ip命令

預備知識準備如下,需盡可能全面了解,如有不足,自行再做補充 1 乙太網卡 應用最多的網路裝置 配置路由 route ethx route add net 192.168.0.0 24 gw 172.16.100.177 ps 在 etc sysconfig network script 下,自己建立...

linux 網路基礎之IP位址

ip是英文internet protocol的縮寫,意思是 網路之間互連的協議 也就是為計算機網路相互連線進行通訊而設計的協議。ip 公有位址 公有位址 public address 由inter nic internet network information center網際網路資訊中心 負責。...