當前位置:首頁 » 編程語言 » c語言中ntohs函數用法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中ntohs函數用法

發布時間: 2022-08-18 12:25:47

㈠ C++socket編程,數據轉為網路位元組序的問題htons

C語言只規定short <= int <=long int。具體還得看具體的編譯器
htons() host to network short
htonl() host to network long
ntohl() network to host long
ntohs() network to host short

㈡ c++builder 中用到一個htons()函數 不知其用法是什麼

htons多用於socket通信中,功能是將2個位元組的數據從主機位元組順序變成網路位元組順序。
h:host
n:net
s:short
host to net short

對應的還有htonl,ntohl,ntohs。明白了吧。

我試過了
printf("%x\n",htons(0x004e));
結果是4e00。
因為通常我們的主機位元組順序是小序在前,而網路位元組順序是大序在前。所以轉換後是顛倒了一下。

㈢ htons()/ntohs()函數使用具體請看代碼

htons和ntohs實際上是兩個相同的函數,如果主機與網路位元組順序不同,顛倒過來(按位元組,參數是u_short,兩個位元組)
0x1234---->0x3412
否則不變。
就是說htons和ntohs都是將0xabcdefgh變為0xghefcdab
0xabcd變為0xcdab。

㈣ ntohs()的其他

本函數將一個16位數從主機位元組順序轉換成網路位元組順序。
返回值:
htons()返回一個網路位元組順序的值。
這2個函數提供了主機位元組順序與網路位元組順序的轉換
比如網路位元組 為 00 01
u_short a如果直接對應的話 a=0100; 為什麼呢?因為主機是從高位元組到低位元組的,所以應該轉化後a=ntohs(0001); 這樣 a=0001; htonl()表示將32位的主機位元組順序轉化為32位的網路位元組順序 htons()表示將16位的主機位元組順序轉化為16位的網路位元組順序(ip地址是32位的埠號是16位的 )
將IP地址轉換成長整型:首先,假設你已經有了一個sockaddr_in結構體ina,你有一個IP地址132.241.5.10 要儲存在其中,你就要用到函數inet_addr(),將IP地址從點數格式轉換成無符號長整型。使用方法如下:ina.sin_addr.s_addr = inet_addr(132.241.5.10);
注意,inet_addr()返回的地址已經是網路位元組格式,所以你無需再調用函數htonl()。
我們現在發現上面的代碼片斷不是十分完整的,因為它沒有錯誤檢查。顯而易見,當inet_addr()發生錯誤時返回-1。記住這些二進制數字?(無符號數)-1僅僅和IP地址255.255.255.255相符合!但這可是廣播地址!所以,記住要先進行錯誤檢查。
怎樣將一個in_addr結構體輸出成點數格式?你要用到函數 inet_ntoa()(ntoa的含義是network to ascii),就像這樣:printf(%s,inet_ntoa(ina.sin_addr));它將輸出IP地址。需要注意的是inet_ntoa()將結構體in_addr作為一個參數,不是長整形。同樣需要注意的是它返回的是一個指向一個字元的指針。它是一個由inet_ntoa()控制的靜態的固定的指針,所以每次調用 inet_ntoa(),它就將覆蓋上次調用時所得的IP地址。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr);
a2 = inet_ntoa(ina2.sin_addr);
printf(address 1: %s ,a1);
printf(address 2: %s ,a2);
輸出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要保存這個IP地址,使用strcpy()函數來指向你自己的字元指針。 簡述:
將網路地址轉換成「.」點隔的字元串格式。
#include<winsock.h>
char FAR* PASCAL FAR inet_ntoa( struct in_addr in);
in:一個表示Internet主機地址的結構。
注釋:
本函數將一個用in參數所表示的Internet地址結構轉換成以「.」 間隔的諸如「a.b.c.d」的字元串形式。請注意inet_ntoa()返回的字元串存放在WINDOWS套介面實現所分配的內存中。應用程序不應假設該內存是如何分配的。在同一個線程的下一個WINDOWS套介面調用前,數據將保證是有效。
返回值:
若無錯誤發生,inet_ntoa()返回一個字元指針。否則的話,返回NVLL。其中的數據應在下一個WINDOWS套介面調用前復制出來。
參見: inet_addr().
測試代碼如下
#pragma comment (lib,Ws2_32.lib)
//noths.obj : error LNK2001: unresolved external ymbol _inet_addr@4
#include <winsock.h>
#include <iostream.h>
#include <stdio.h>
int main(int aargc, char* argv[])
{
struct in_addr addr1,addr2;
unsigned long l1,l2;
l1= inet_addr(192.168.0.74);
l2 = inet_addr(211.100.21.179);
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf(%s : %s , inet_ntoa(addr1), inet_ntoa(addr2)); //注意這一句的運行結果
printf(%s , inet_ntoa(addr1));
printf(%s , inet_ntoa(addr2));
return 0;
}
實際運行結果如下:
192.168.0.74 : 192.168.0.74 //從這里可以看出,printf里的inet_ntoa只運行了一次。
192.168.0.74
211.100.21.179
inet_ntoa返回一個char *,而這個char *的空間是在inet_ntoa裡面靜態分配的,所以inet_ntoa後面的調用會覆蓋上一次的調用。第一句printf的結果只能說明在printf裡面的可變參數的求值是從右到左的,僅此而已。

㈤ ntohs()的介紹

ntohs()是一個函數名,作用是將一個16位數由網路位元組順序轉換為主機位元組順序1。

㈥ ntohs()的注釋

本函數將一個16位數由網路位元組順序轉換為主機位元組順序。

㈦ htons htonl ntohl ntohs 的區別和作用

htons、htonl、ntohl、ntohs是用來在網路位元組順序和本機位元組順序之間相互轉換的函數。

可以這么理解:

n :network;h :host;s:short;l:long

htons :host to network short型,依次類推。

具體用法為:

htons:

#include

u_short PASCAL FAR htons( u_short hostshort);

hostshort:主機位元組順序表達的16位數。

注釋:

本函數將一個16位數從主機位元組順序轉換成網路位元組順序。

返回值:

htons()返回一個網路位元組順序的值。

其餘的同理。

㈧ C語言中,windows平台下使用ntohs函數應該包含哪個頭文件

應包含的頭文件為:#include <netinet/in.h>

ntohs函數是將一個無符號短整形數從網路位元組順序轉換為主機位元組順序。

函數原型:uint16_t ntohs(uint16_t netshort);
參 數:netshort:一個以網路位元組順序表達的16位數。
返 回 值:返回一個以主機位元組順序表達的數。

㈨ printf("port=%d,ip=%s=%s",ntohs(curclient->addr.sin_port),inet_ntoa(curclient->addr.sin_addr),buf)

之所以需要這些函數是因為計算機數據表示存在兩種位元組順序:NBO與HBO
網路位元組順序NBO(Network Byte Order):
按從高到低的順序存儲,在網路上使用統一的網路位元組順序,可以避免兼容性問題。
主機位元組順序(HBO,Host Byte Order):
不同的機器HBO不相同,與CPU設計有關,數據的順序是由cpu決定的,而與操作系統無關。
如 Intelx86結構下,short型數0x1234表示為34 12, int型數0x12345678表示為78 56 34 12如IBM power PC結構下,short型數0x1234表示為12 34, int型數0x12345678表示為12 34 56 78

由於這個原因不同體系結構的機器之間無法通信,所以要轉換成一種約定的數序,也就是網路位元組順序,其實就是如同powerpc那樣的順序 。在PC開發中有ntohl和htonl函數可以用來進行網路位元組和主機位元組的轉換。

請採納。

㈩ 什麼時候需要高低位元組序轉換,即ntohs()函數

ntohs()
網路位元組序->主機位元組序

網路位元組序規定了數據在網路中傳輸的位元組順序,各主機再根據自身的環境將網路位元組序轉換成適應自身的主機位元組序。

數值:0x1245
在X86系統中這樣存儲
內存地址 數據
00 12
01 45

發送時從低地址讀取數據
所以發送順序為 12 45

而在其它系統中有可能這樣存儲:
內存地址 數據
00 45
01 12
如果不轉換為網路位元組序,按 45 12發送,則X86系統就理解為0x4512了。