01大小端 網路位元組序 位址轉換函式的使用

2021-08-28 01:17:40 字數 3166 閱讀 2779

#include 

#include

#include

#include

#include

#include /* superset of previous */

#include

#include

/* man 7 ip

ipv4套接字位址結構

struct sockaddr_in ;

//internet address

struct in_addr ;

typedef uint32_t in_addr_t;

struct in_addr ;

man htonl

//位元組排序函式

#include 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 s代表short;l代表long

*///測試大小端

#if 0

void test()

else

printf("把本地位元組轉換成網路位元組\n");

uint32_t mynetdata = htonl(data);

p = (char *)&mynetdata;

if(p[0] == 0x78)

else

}#endif

/*

訊號處理函式遇上可重入和不可重入函式

可重入函式概念

1、為了增強程式的穩定性,在訊號處理函式中應使用可重入函式。

2、所謂可重入函式是指乙個可以被多個任務呼叫的過程,任務在呼叫時

不必擔心資料是否會出錯。因為程序在收到訊號後,就將跳轉到訊號處理

函式去接著執行。如果訊號處理函式中使用了不可重入函式,那麼訊號

處理函式可能會修改原來程序中不應該被修改的資料,這樣程序從訊號

處理函式中返回接著執行時,可能會出現不可預料的後果。不可再入函式

在訊號處理函式中被視為不安全函式。

3、滿足下列條件的函式多數是不可重入的:

(1)使用靜態的資料結構,如getlogin(),gmtime(),getgrgid(),getgrnam(),

getpwuid()以及getpwnam()等等;

(2)函式實現時,呼叫了malloc()或者free()函式;

(3)實現時使用了標準i/o函式的

*//*

點分十進位制字串與32位的網路位元組序二進位制值轉換ipv4位址

#include //點分十進位制的字串轉化為32位網路位元組序

int inet_aton(const char *cp, struct in_addr *inp);//1

//點分十進位制的字串轉化為32位網路位元組序

in_addr_t inet_addr(const char *cp);//2 已經被廢棄,應使用4 最好使用5

//32位網路位元組序轉化為點分十進位制的字串

char *inet_ntoa(struct in_addr in);//4

in_addr_t inet_network(const char *cp);

struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

注意:char *inet_ntoa(struct in_addr in);//4

1)函式返回值指向的字串駐留在靜態記憶體中,是不可重入的,

2)函式的引數是乙個結構體,而不是指標.

答案:正常使用應該是傳入乙個指標,主調函式分配記憶體,使用完再釋放!

linux核心不這麼做,你就分配個記憶體給到我,我給你轉一把,然後把

記憶體位址給到你,其實還是你分配的那個記憶體。

借用了你分配的記憶體了。

*///位址轉換函式

#if0

void test()

//請你深刻的理解為什麼這個地方 要求傳入的是元素

/*//internet address.

struct in_addr ;

*/printf("ip is %s\n", inet_ntoa(inp));

}#endif

/*

p代表表達(presentation) n代表數值(numeric)

af argument must be either af_inet or af_inet6.

//點分十進位制-》32位二進位制ipv4或者

int inet_pton(int af, const char *src, void *dst);

const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

*///位址轉換函式

#if 1

void test()

; char addptr[16] = ;

const char *cp = "192.168.66.128";

int ret;

socklen_t size = sizeof(ip);

char *p = null;

//af_inet or af_inet6.

ret = inet_pton(af_inet, cp, (void *)addptr);

if (ret == 0)

else

if (ret == -1)

if (ip != null)

if (errno == enospc)

if (p != ip)

printf("ip is %s\n", ip);

}#endif

int main()

大小端 網路位元組序 本地位元組序問題

總結 1 80x86使用小端法 即本地位元組序 網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳...

大端位元組序 小端位元組序(網路位元組序 主機位元組序)

大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...

大小端 網路位元組序問題

總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...