struct in_addr 結構體:
struct in_addr {
in_addr_t s_addr;
};
表示一個32位的IPv4地址。
in_addr_t一般為32位的unsigned int,其字節順序為網絡字節序,即該無符號數采用大端字節序。其中每8位表示一個IP地址中的一個數值。
打印的時候可以調用inet_ntoa()函數將其轉換為char*類型。
頭文件為:#include <arpa/inet.h>
inet——ntoa()函數用於將一個十進制網絡字節序轉換為點分十進制IP格式的字符串。
函數原型為:char*inet_ntoa(struct
in_addr in);
頭文件為:
arpa/inet.h
網絡字節序和主機字節序比較容易混亂(大端表示和小端表示)。
網絡字節序采用大端表示,就是數據的高位要存放到低地址。
而大多數主機字節序采用小端表示(也有采用大端表示的主機字節序),就是數據的低位放到低地址。
比如無符號整型1338378,的二進制表示為:
數據的高位----------------------------》數據的地位
00000000 00010100 01101100 00001010
所以采用小端表示的主機字節序時,內存中存放的形式為:
低地址----------------------------------------》高地址
00001010 01101100 00010100 00000000
所以可以自己寫個小程序來代替inet_ntoa()函數。
#include<stdio.h> #include<stdlib.h> #include<string.h> void toStringIP(const unsigned int ip,char *stringIP); int main() { unsigned int ip=1338378; char* stringIP = (char*)malloc(16); memset(stringIP,0,16+1); toStringIP(ip,stringIP); puts(stringIP); return 0; } void toStringIP(const unsigned int ip,char *stringIP) { unsigned int tempIP=ip; for(int i=0;i<3;i++) { unsigned char part=(char)tempIP; char temp[4]; sprintf(temp,"%d.",part); strcat(stringIP,temp); tempIP=tempIP>>8; } unsigned char part=(char)tempIP; char temp[4]; sprintf(temp,"%d",part); strcat(stringIP,temp); }
如果您覺得對您有幫助,請點贊哦^^