socket程式設計 常用轉換函式
阿新 • • 發佈:2020-09-07
htons()函式和ntohs()函式
由於不同CPU有著不同的位元組序,故在進行網路通訊時要統一轉化為網路位元組序。網路位元組順序是TCP/IP中規定好的一種資料表示格式,它與具體的CPU型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組序採用大端法(big-endian),即地址的地位儲存值的高位。
htons函式原型:
u_short htons(u_short hostshort);
//htons的功能:將一個無符號短整型(2個位元組)的主機數值轉換為網路位元組順序
常見寫法:
SOCKADDR_IN addr; addrServer.sin_family = AF_INET; addrServer.sin_port = htons(PORT); /*埠號,主機位元組序轉網路位元組序*/ addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /*主機位元組序轉網路位元組序*/
ntohs函式原型:
u_short ntohs(u_short netshort);
//ntohs的功能: 將一個無符號短整型(2個位元組)的網路數值轉換為主機位元組順序
可以利用ntohs列印埠:
int port = ntohs(addr.sin_addr);
tips: "n" = "net","h"= "host", "s"="short",故"htons" = "host to net short","ntohs" = "net to host short"
htonl()函式和ntohl()函式
htonl函式原型:
u_long htonl(u_long hostlong);
//htonl的功能:將一個無符號長整型(4個位元組)的主機數值轉換為網路位元組順序
ntohs函式原型:
u_long ntohl(u_long netlong);
//ntohl的功能: 將一個無符號長整型(4個位元組)的網路數值轉換為主機位元組順序
inet_ntoa()函式
inet_ntoa函式原型:
char * inet_ntoa(struct in_addr in); //inet_ntoa的功能:將一個32位網路位元組序的二進位制IP地址轉換成相應的點分十進位制的IP地址(返回點分十進位制的字串在靜態記憶體中的指標)形如"a.b.c.d",若轉換失敗返回NULL。
由於返回靜態指標,故每次呼叫 inet_ntoa(),它就將覆蓋上次呼叫時所得的IP地址。所以如果要連續呼叫不能拷貝指標,而是要用strcpy儲存。
常見寫法:
SOCKADDR_IN addr;//地址
......
// "ntoa" ="net to ascii"
printf_s("the IP is [%s:%d]\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
...
inet_addr()函式
inet_addr函式原型:
unsigned long inet_addr(const char* cp);
//inet_addr()的功能是將字串形式的IP地址("a.b.c.d")轉換為按網路位元組順序的整型值
常見寫法:
SOCKADDR_IN socket;
sock.sin_family = AF_INET;
sock.sin_port = htons(PORT);
//將字串轉換為in_addr型別,由於自動轉化為網路位元組序,無需再使用htonl函式轉換
sock.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");