ntohs(), ntohl() , htons(), htonl(), inet_ntoa(), inet_pton(), atoi()匯總

在C/C++寫網絡程序的時候,往往會遇到字節的網絡順序和主機順序的問題。這是就可能用到htons(), ntohl(), ntohs(),htons()這4個函數。
網絡字節順序與本地字節順序之間的轉換函數:

htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"

之所以需要這些函數是因為計算機數據表示存在兩種字節順序:NBO與HBO

網絡字節順序NBO(Network Byte Order): 按從高到低的順序存儲,在網絡上使用統一的網絡字節順序,可以避免兼容性問題。

主機字節順序(HBO,Host Byte Order): 不同的機器HBO不相同,與CPU設計有關,數據的順序是由cpu決定的,而與操作系統無關。
如 Intel x86結構下, short型數0x1234表示為34 12, int型數0x12345678表示為78 56 34 12 ?
如 IBM power PC結構下, short型數0x1234表示為12 34, int型數0x12345678表示為12 34 56 78
? ?
由于這個原因不同體系結構的機器之間無法通信,所以要轉換成一種約定的數序,也就是網絡字節順序,其實就是如同power pc那樣的順序. 在PC開發中有ntohl和htonl函數可以用來進行網絡字節和主機字節的轉換.

在Linux系統下:htonl(),htons(), ntohl(), ntohs()的頭文件及函數定義: ?

? #include <arpa/inet.h>?
? uint32_t htonl(uint32_t hostlong); ??

? uint16_t htons(uint16_t hostshort); ??

? uint32_t ntohl(uint32_t netlong); ??

? uint16_t ntohs(uint16_t netshort);?
? 在windows系統下:htonl(),htons(), ntohl(), ntohs(), inet_addr()使用說明 ?

? ntohs() ? 簡述:?
? 將一個無符號短整形數從網絡字節順序轉換為主機字節順序。 ?

? #include <winsock.h>?
? u_short PASCAL FAR ntohs( u_short netshort); ??

? netshort:一個以網絡字節順序表達的16位數。 ? 注釋:?
? 本函數將一個16位數由網絡字節順序轉換為主機字節順序。 ??

? 返回值:ntohs()返回一個以主機字節順序表達的數。 ?

?

?ntohl() ? 簡述:?
? 將一個無符號長整形數從網絡字節順序轉換為主機字節順序。 ??

#include <winsock.h>?
?u_long PASCAL FAR ntohl( u_long netlong);

?netlong:一個以網絡字節順序表達的32位數。 ?

?注釋:?
? 本函數將一個32位數由網絡字節順序轉換為主機字節順序。 ??

返回值:?
? ntohl()返回一個以主機字節順序表達的數。 ??

?

htons() ? 簡述:?
? 將主機的無符號短整形數轉換成網絡字節順序。

//將無符號短整型主機字節序轉換為網絡字節序?
? #include <winsock.h>?
? u_short PASCAL FAR htons( u_short hostshort); ??

? hostshort:主機字節順序表達的16位數。 ??

? 注釋:?
? 本函數將一個16位數從主機字節順序轉換成網絡字節順序。?

? 返回值:?
? htons()返回一個網絡字節順序的值。?
? 簡單地說,htons()就是將一個數的高低位互換 ? (如:12 34 --> 34 12) ?

? VB表示:?
? MsgBox Hex(htons(&H1234)) ? 顯示值為 3412 ?

?

? htonl()?
? 簡述:?
? 將主機的無符號長整形數轉換成網絡字節順序。

? ?//將無符號長整型網絡字節序轉換為主機字節序?
? #include <winsock.h>?
? u_long PASCAL FAR htonl( u_long hostlong);?
? hostlong:主機字節順序表達的32位數。?

? 注釋:?
? 本函數將一個32位數從主機字節順序轉換成網絡字節順序。 ??

? 返回值:?
? htonl()返回一個網絡字節順序的值。 ??

??

? inet_addr() ? 簡述:?
? 將一個點間隔地址轉換成一個in_addr。 ??

? #include <winsock.h>?
? unsigned long PASCAL FAR inet_addr( const struct FAR* cp);?
? cp:一個以Internet標準“.”間隔的字符串。

? 例如202.38.214.xx ? 當IP地址為255.255.255.255是被認為無效IP地址。?
? 本函數解釋cp參數中的字符串,這個字符串用Internet的“.”間隔格式表示一個數字的Internet地址。 ??

? 返回值:?
? 一個無符號長整形數,可用作Internet地址。所有Internet地址以網絡字節順序返回(字節從左到右排列)。

?

? inet_ntoa() ? 簡述:?
? 將網絡地址轉換成“.”點隔的字符串格式。 ??

#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套接口調用前,數據將保證是有效。?
? 當IP地址為255.255.255.255是認為有效IP地址。這是與inet_addr()的區別 ??

?返回值:?
? 若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NULL。其中的數據應在下一個WINDOWS套接口調用前復制出來。 ?

? inet_aton() ? 與inet_ntoa()作用相反。 ??

?

inet_pton() ? 簡述:?
? 本函數將點分十進制轉換為整數 ??

#include <sys/types.h> ??

#include <sys/socket.h> ??

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);?
? 這個函數轉換字符串到網絡地址,第一個參數af是地址族,轉換后存在dst中 ? inet_pton 是inet_addr的擴展,支持的多地址族有下列: ? af = AF_INET?
? src為指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函數將該地址?
? 轉換為in_addr的結構體,并復制在*dst中 ? af =AF_INET6?
? src為指向IPV6的地址,,函數將該地址轉換為in6_addr的結構體,并復制在*dst中 ? 如果函數出錯將返回一個負值,并將errno設置為EAFNOSUPPORT,如果參數af指定的地址族和src格式不對,函數將返回0。 ??

?

#include <sys/types.h> ??

#include <sys/socket.h> ??

#include <arpa/inet.h>?
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);?
? 這個函數轉換網絡二進制結構到ASCII類型的地址,參數的作用和上面相同,只是多了一個參數socklen_t cnt,他是所?
? 指向緩存區dst的大小,避免溢出,如果緩存區太小無法存儲地址的值,則返回一個空指針,并將errno置為ENOSPC ??

?

atoi()?
? array to integer將字符串轉換為整形數?首先,假設你已經有了一個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相符合!這可是廣播地址!大錯特 錯!記住要先進行錯誤檢查。?
? 好了,現在你可以將IP地址轉換成長整型了。有沒有其相反的方法呢? 它可以將一個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); /* 這是198.92.129.1 */ ? a2 = inet_ntoa(ina2.sin_addr); /* 這是132.241.5.10 */ ? printf("address 1: %s ",a1); ? printf("address 2: %s ",a2); ? 輸出如下:?
? address 1: 132.241.5.10 ??
address 2: 132.241.5.10?
? 假如你需要保存這個IP地址,使用strcopy()函數來指向你自己的字符指針。 ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384776.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數字邏輯 Verilog】全面剖析數據選擇器——從基礎到拓展,從理論到設計的實現,從表面到本質

0 前言 0.1 使用環境 EDA工具&#xff1a;Vivado 2017.4硬件描述語言&#xff1a;Verilog HDL 0.2 涉及知識 數字邏輯Verilog 1 基礎模塊&#xff1a;一位四選一數據選擇器 1.1 設計部分&#xff1a;層次建模 1.1.1 需求分析 設計一個一位的四選一數據選擇器&#xff0…

exec函數族(部分 最常用的)

進程調用exec函數族執行某個程序 進程當前程序被執行程序替換 讓父子進程執行不同的程序 父進程創建子進程 子進程調用exec函數族 父進程不受影響 #include<unistd.h> int execl(const char *path, const char *arg, ...) int execlp(const char *file, const cha…

【計算機網絡】手動配置hosts文件解決使用GitHub和Coursera網站加載慢/卡的問題

目錄0 前言1 打開hosts1.1 以管理員身份運行記事本1.2 打開hosts2 找到實際地址2.1 打開cmd2.2 找到網址3 替換地址3.1 修改hosts文件3.2 刷新4 后續內容的完善0 前言 本文是針對純小白讀者&#xff0c;沒有涉及到任何的專業知識&#xff0c;你只需要按照步驟操作即可。 同時…

【匯編語言】鏡像遷移能力之一通百通——由代碼段和CS:IP的原理,掌握一類寄存器的使用

0 前言 你應該知道8086CPU的物理地址形成方式及其原理&#xff0c;才能完成本文的學習。 1 內存的分段 對于內存&#xff0c;人們人為地將其劃分為一段一段的&#xff0c;比如代碼段和數據段等&#xff0c;特別注意&#xff0c;這是人為劃分的結果&#xff0c;方面人類使用&…

線程間通信————同步

同步 是指多個任務按照約定的先后次序 相互配合完成一件事情 信號量&#xff1a; 由信號量決定 線程是繼續執行 還是阻塞等待 信號量代表某種資源 其值表示系統中該資源的數量 信號量是一個受保護的量 只能通過特定的三種操作來訪問 初始化 P操作&#xff08;申請資源&…

【計算機組成原理 數字邏輯 Verilog】32位加法器的實現:支持整數的加減運算

目錄0 前言0.1 使用環境0.2 知識點0.3 注意事項1 建模&#xff1a;1位加法器1.1 構建基礎模型1.1.1 一位加法器1.1.1.1 科技黑箱&#xff1a;外部端口與功能1.1.1.2 揭秘黑箱&#xff1a;內部結構與模塊1.1.2 從頂層模塊提取低層模塊&#xff1a;取反功能選擇器1.1.2.1 科技黑箱…

線程間通信————互斥

互斥 臨界資源 一次只允許一個任務&#xff08;進程&#xff0c;線程)訪問的共享資源 臨界區 訪問臨界資源的代碼 互斥機制 mutex互斥鎖 任務訪問臨界資源前申請鎖 訪問完后釋放鎖 互斥鎖初始化 #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mute…

【Verilog HDL】門級描述 / 數據流描述 / 行為級描述——通過四選一多路選擇器,實現對于不同層級描述方式的整體性認知

目錄0 前言1 輸出端口的設計1.1 門級描述和數據流描述1.2 行為級描述2 三種描述方式的整體架構2.1 門級描述2.2 數據流描述2.3 行為級描述2.4 補充&#xff1a;獨立的語句2.5 小結3 理解三種描述方式的本質3.1 門級描述3.2 數據流描述3.3 行為級描述4 理解不同抽象層級描述方式…

線程創建-結束-回收 教程

ps aux -L 查看線程信息 且顯示進程狀態 使用進程的缺點: 進程切換 系統開銷較大 開銷大的原因 &#xff1a;切換時需要頻繁刷新 cache(類似于緩沖區) 和TLB linux不區分線程 進程 線程其實也屬于進程 只不過是特殊的進程 是一種可以共享地址空間的進程 使用線程的優點&#x…

【匯編語言】匯編實驗IDE(集成開發環境):RadASM的安裝和使用說明

0 前言 本文適合8086CPU的指令集。 對于重要的專業基礎課程&#xff0c;匯編語言&#xff0c;做實驗是必不可少的&#xff0c;但是由于匯編語言本身的缺陷&#xff0c;現代計算機并不能直接運行匯編語言程序&#xff0c;因此&#xff0c;一般老師會要求我們 使用虛擬機&…

【匯編語言】理解8086CPU中,不同類型的寄存器和匯編指令規則的聯系(會繼續更新)

0 前言 你是否因為匯編指令繁雜的規則而苦惱呢&#xff1f;作者本人也很煩&#xff0c;因為往往教材中只告訴我們規則&#xff0c;卻不告訴我們為什么&#xff0c;沒有原因就直接記憶&#xff0c;負擔太大&#xff0c;后期靈活運用也增添阻力&#xff0c;因此&#xff0c;我經…

System V IPC之信號燈

信號燈也叫信號量 用于進程/線程同步或互斥的機制 信號燈的類型 1.Posix 無名信號燈 2.Posix 有名信號燈 3.System V 信號燈 信號燈的含義 計數信號燈&#xff08;1和2都是&#xff09; System V信號燈是一個或多個計數信號燈的集合&#xff08;可操作集合中的多個信號燈&…

【VS 2017 C語言 匯編語言】如何使用VS 2017,通過反匯編查看C語言代碼對應的32位x86匯編語言 VS 2017單步調試的使用

0 前言 本文適用于VS的大多數版本&#xff0c;本文以VS 2017為例進行講解。 1 編輯C語言代碼 首先&#xff0c;在VS編譯器中&#xff0c;創建項目&#xff0c;敲一段C語言代碼&#xff0c;這個過程不解釋了&#xff0c;如果不會請百度。 #include <stdio.h> #include…

System V IPC之共享內存

共享內存是一種最為高效的進程間通信方式&#xff0c;進程可以直接讀寫內存&#xff0c; 而不需要任何數據的拷貝 共享內存在內核空間創建&#xff0c; 可以被進程映射到用戶空間訪問 由于多個進程可同時訪問共享內存 &#xff0c; 因此需要同步和互斥機制配合使用 共享內存的使…

【匯編語言】結合C語言,使用VS 2017調試模式下的反匯編工具學習32位x86匯編指令

0 前言 簡要說明x86系列指令集的整體概況與變化。 我給到你補充學習內容&#xff1a;使用VS學習匯編語言的教程 1 8086CPU到現代CPU的變化 做一些了解即可&#xff0c;不是絕對的&#xff0c;取決于設計工藝以及用途&#xff0c;不同計算機不一樣也正常。 1.1 CPU位數與地…

System V IPC之消息隊列

消息隊列由消息隊列id來唯一標識 消息隊列就是一個消息的列表 用戶可以在消息隊列中添加消息 讀取消息 消息隊列可以按照類型來發送和接收消息 消息隊列使用步驟 打開/創建消息隊列 msgget 向消息隊列發送消息 msgsnd 從消息隊列接收消息 msgrcv 控制消息隊列 msgctl 創建/打開…

【匯編語言】學習源頭知識:XLAT指令的本質(待更新)

0 前言 帶你理解XLAT指令的本質. 我想讓你清楚的是&#xff0c;XLAT指令 本質就是數據的傳送&#xff1a;本質就是完成mov指令的傳送功能&#xff0c;只不過源操作數的尋址方式是[bxal]&#xff0c;目標操作數是al表象是數據的轉換&#xff1a;例如將十六進制轉換為ASCII字符…

進程間通信————信號

信號 信號是在軟件層次上對中斷機制的一直模擬&#xff0c;是一種異步通信方式 linux內核通過信號通知用戶進程&#xff0c; 不同的信號類型代表不同的事件 進程對信號有不同的響應方式 缺省方式 忽略信號 捕捉信號 SIGKILL和SIGSTOP這兩個信號量 級別很高 只能執行默認操作…

【匯編語言】清華大學學堂在線《匯編語言程序設計》課程學習筆記

0 前言 全是基于x86系列處理器 1 寄存器與存儲器的區別 2 匯編程序員眼中的系統結構 指令寄存器 PC&#xff08;Program Counter&#xff09; 指向下一條指令的地址 16位 CS:IP32位 EIP64位 RIP 寄存器與寄存器堆&#xff08;Registers&#xff09; 在處理器內部以名字方…

進程間通信————無名管道

無名管道 只能用于具有親緣關系的進程之間的通信 單工的通信模式 具有固定的讀端和寫端 無名管道創建時會返回兩個文件描述符 分別用于讀寫管道 只能用于親屬關系之間 創建無名管道 #include <unistd.h> int pipe(int pfd[2]) 成功返回0 失敗返回EOF pfd包含兩個元素的…