#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...