在進行網絡編程時,需要用到IP地址,但是IP地址通常表示的是拆分後的4個十進制數字(例如192.168.1.1),無法直接進行計算。因此,我們需要將這些IP地址轉換為長整型。這篇文章將從多個方面對IP地址轉換為長整型的方法進行詳細的闡述。
一、使用socket庫的inet_aton()函數實現IP地址轉換
socket庫提供了一個函數inet_aton()來實現將IP地址轉換為長整型的功能。該函數的返回值是一個字符串,需要用ntohl()函數將其轉換為長整型。下面是示例代碼:
#include <stdio.h> #include <arpa/inet.h> int main() { char str[] = "192.168.1.1"; unsigned long ip = 0; if(inet_aton(str, (struct in_addr*)&ip) == 0) { printf("Invalid IP address\n"); return 1; } printf("IP address: %lu\n", ntohl(ip)); return 0; }
首先定義了一個字符串變量來表示IP地址。在調用inet_aton()函數將該字符串轉換為長整型時,需要將第二個參數轉換為(struct in_addr*)類型。如果轉換失敗,則說明IP地址無效。最後使用ntohl()函數將轉換後的長整型值從網絡位元組序轉換為主機位元組序,並打印出來。
二、使用socket庫的inet_addr()函數實現IP地址轉換
socket庫提供了另外一個函數inet_addr()來實現將IP地址轉換為長整型的功能。該函數的返回值是一個無符號32位整型值,不需要進行位元組序轉換。下面是示例代碼:
#include <stdio.h> #include <arpa/inet.h> int main() { char str[] = "192.168.1.1"; unsigned long ip = inet_addr(str); if(ip == INADDR_NONE) { printf("Invalid IP address\n"); return 1; } printf("IP address: %lu\n", ip); return 0; }
使用inet_addr()函數將IP地址轉換為長整型,如果返回的是INADDR_NONE,則說明IP地址無效。最後直接打印轉換後的長整型值即可。
三、使用inet_pton()函數實現IP地址轉換
inet_pton()函數可以將點分十進制表示的IP地址轉換為網絡位元組序的二進制格式,具體使用方法如下:
#include <stdio.h> #include <arpa/inet.h> int main() { char str[] = "192.168.1.1"; struct in_addr addr; if(inet_pton(AF_INET, str, &addr) <= 0) { printf("Invalid IP address\n"); return 1; } printf("IP address: %u\n", ntohl(addr.s_addr)); return 0; }
inet_pton()函數的第一個參數是地址族類型,例如AF_INET表示IPv4地址。第二個參數是點分十進制表示的IP地址。第三個參數是指向結構體in_addr的指針。轉換成功後,可以使用ntohl()函數將轉換後的結果從網絡位元組序轉換為主機位元組序,並打印出來。
四、結合位運算實現IP地址轉換
我們知道,一個IPv4地址可以表示為32位二進制整數,而一個四個位元組的無符號整型數據類型也有32位,兩者可以相互轉換。因此,我們可以使用位運算的方法將一個表示為點分十進制形式的IP地址轉換為一個無符號32位整數。具體實現方法如下:
#include <stdio.h> unsigned long ip2long(char* ip) { unsigned long n = 0; for(int i = 0; i < 4; i ++) { n |= (unsigned long)atoi(ip) << (24 - i * 8); ip = strchr(ip, '.') + 1; } return n; } int main() { char str[] = "192.168.1.1"; unsigned long ip = ip2long(str); printf("IP address: %lu\n", ip); return 0; }
在ip2long()函數中,我們首先定義一個無符號32位整數n,初始值為0。然後使用atoi()函數將ip字符串中的每個數字轉換為整型,再使用位運算將其插入到n中對應的位置。最後,將轉換後的長整型值打印出來即可。
五、結合inet_ntoa()函數將長整型轉換為IP地址
我們也可以將長整型數字轉換為點分十進制表示的IP地址,可以用inet_ntoa()函數實現。下面是示例代碼:
#include <stdio.h> #include <arpa/inet.h> int main() { unsigned long n = 3232235777; struct in_addr addr; addr.s_addr = htonl(n); printf("IP address: %s\n", inet_ntoa(addr)); return 0; }
定義一個無符號32位整數n,調用htonl()函數將主機位元組序的n轉換為網絡位元組序。接着定義一個in_addr類型的結構體addr,將網絡位元組序的n賦值給addr.s_addr成員,最後調用inet_ntoa()函數將addr轉換為點分十進制表示的IP地址,並打印出來。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254356.html