1. 程式人生 > 實用技巧 >socket程式設計 常用轉換函式

socket程式設計 常用轉換函式

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