struct in_addr 結構體


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);

  

}

 如果您覺得對您有幫助,請點贊哦^^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM