inet_ntoa、 inet_aton、inet_addr

轉自:http://blog.csdn.net/zhangboyj/article/details/6157263

inet_addr()

  簡述:將一個點間隔地址轉換成一個in_addr。
  #include <winsock.h>
  unsigned long PASCAL FAR inet_addr( const struct FAR* cp);
  cp:一個以Internet標準“.”間隔的字符串。
  注釋:
  本函數解釋cp參數中的字符串,這個字符串用Internet的“.”間隔格式表示一個數字的Internet地址。返回值可用作Internet地址。所有Internet地址以網絡字節順序返回(字節從左到右排列)。
  Internet地址用“.”間隔的地址可有下列幾種表達方式:
  a.b.c.d,a.b.c,a.b,a
  當四個部分都有定值時,每個都解釋成一個字節數據,從左到右組成Internet四字節地址。請注意,當一個Internet地址在Intel機器上表示成一個32位整型數時,則上述的字節為“d.c.b.a”。這是因為Intel處理器的字節是從右向左排列的。
  請注意:只有Berkeley支持下述表達法,Internet其余各處均不支持。考慮到與軟件的兼容性,應按規定進行使用。
  對一個三部分地址,最后一部分解釋成16位數據并作為網絡地址的最右兩個字節。這樣,三部分地址便很容易表示B組網絡地址,如“128.net.host”.
  對一個兩部分地址,最后一部分解釋成24位數據并作為網絡地址的最右三個字節,這樣,兩部分地址便很容易表示C組網絡地址,如“net.host”。
  對僅有一個部分的地址,則將它的值直接存入網絡地址不作任何字節的重組。
  返回值:
  若無錯誤發生,inet_addr()返回一個無符號長整型數,其中以適當字節順序存放Internet地址。如果傳入的字符串不是一個合法的Internet地址,如“a.b.c.d”地址中任一項超過255,那么inet_addr()返回INADDR_NONE。
  參見:

  inet_ntoa().

inet_addr()函數的實現

輸入是點分的IP地址格式(如A.B.C.D)的字符串,從該字符串中提取出每一部分,轉換為ULONG,假設得到4個ULONG型的A,B,C,D,
ulAddress(ULONG型)是轉換后的結果,
ulAddress = D<<24 + C<<16 + B<<8 + A(網絡字節序),即inet_addr(const char *)的返回結果
另外,我們也可以得到把該IP轉換為主機序的結果,轉換方法一樣
A<<24 + B<<16 + C<<8 + D

?

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套接口調用前,數據將保證是有效。
  返回值:
  若無錯誤發生,inet_ntoa()返回一個字符指針。否則的話,返回NULL。其中的數據應在下一個WINDOWS套接口調用前復制出來。
  測試代碼如下
  include <stdio.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <string.h>
  int main(int aargc, char* argv[])
  {
  struct in_addr addr1,addr2;
  ulong 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/n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意這一句的運行結果
  printf("%s/n", inet_ntoa(addr1));
  printf("%s/n", 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里面的可變參數的求值是從右到左的,僅此而已。
?
inet_aton()
?
inet_aton是一個改進的方法來將一個字符串IP地址轉換為一個32位的網絡序列IP地址。這個函數的概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *string, struct in_addr *addr);

inet_aton函數接受兩個參數。參數描述如下:

1 輸入參數string包含ASCII表示的IP地址。
2 輸出參數addr是將要用新的IP地址更新的結構。

如果這個函數成功,函數的返回值非零。如果輸入地址不正確則會返回零。使用這個函數并沒有錯誤碼存放在errno中,所以他的值會被忽略。

對于這個函數有一點迷惑的就是這個函數調用所需要的兩個參數。如果我們定義了一個AF_INET套接口地址:

struct sockaddr_in adr_inet;??? /* AF_INET */

提供給inet_aton函數調用的參數指針為 &adr_inet.sin_addr

下面這個程序使用inet_aton函數,而不是我們在前面所談到的in_addr函數。
/*
?* inetaton.c
?*
?* Example using inet_aton
?*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
?* this function reports the error and
?* exits back to the shell
?*/
static void bail(const char *on_what)
{
??? fputs(on_what,stderr);
??? fputs("/n",stderr);
}

int main(int argc,char **argv)
{
??? int z;
??? struct sockaddr_in adr_inet;??? /* AF_INET */
??? int len_inet;??? ??? ??? /* length */
??? int sck_inet;??? ??? ??? /* Socket */

??? /* Create a Socket */
??? sck_inet = socket(AF_INET,SOCK_STREAM,0);

??? if(sck_inet == -1)
??? bail("Socket()");

??? /* Establish address */
??? memset(&adr_inet,0,sizeof adr_inet);
??? adr_inet.sin_family = AF_INET;
??? adr_inet.sin_port = htons(9000);

??? if( !inet_aton("127.0.0.1",&adr_inet.sin_addr))
??? bail("bad address");

??? len_inet = sizeof adr_inet;

??? /* Bind it to the socket */
??? z = bind(sck_inet,(struct sockaddr *)&adr_inet,len_inet);

??? if(z == -1)
??? bail("bind()");

??? /* Display our socket address */
??? system("netstat -pa --tcp 2>/dev/null"
??? ??? " | grep inetaton");

??? return 0;
}
程序的運行結果如下:
S$ ./inetaton
tcp 0 0 127.0.0.23:9000 *:* CLOSE 1007/inetaton

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

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

相關文章

對象的淺拷貝和深拷貝

對象的淺拷貝和深拷貝簡要介紹代碼實現簡要介紹 淺拷貝&#xff1a;python拷貝一般都是淺拷貝。拷貝時&#xff0c;對象包含的子對象內容不拷貝。因此&#xff0c;源對象和拷貝對象引用同一個對象 深拷貝&#xff1a;使用copy模塊的deepcopy函數&#xff0c;遞歸拷貝對象中包含…

用模板寫單鏈表

轉載自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 為了加深對模板的理解&#xff0c;我們今天一起用模板寫一個單鏈表&#xff0c;希望通過這個例子&#xff0c;能夠幫助大家加深對模板的體會&#xff0c;具體如下&#xff1a; SList.hpp內容&#…

QT事件事件之一:Qt中的事件處理與傳遞

QT事件事件之一&#xff1a;Qt中的事件處理與傳遞前言一、簡介二、QT中的事件三、事件的實現的方法前言 在QT中&#xff0c;事件是我們很常用的東西&#xff0c;以下是我用事件時總結和做法 一、簡介 在QT中&#xff0c;事件作為一個對象&#xff0c;繼承QEvent類&#xff0c…

linux下成功安裝ffmpeg( 親測有效 )

linux下成功安裝ffmpeg&#xff08; 親測有效 &#xff09;一、下載二、安裝步驟1.安裝yasm2.安裝ffmpeg總結一、下載 ffmpeg 官網下載&#xff1a; http://ffmpeg.org/download.html 安裝yasm 官網下載&#xff1a;http://yasm.tortall.net/Download.html 二、安裝步驟 1.…

C++實現 簡單 單鏈表

轉自&#xff1a; http://blog.csdn.net/wonggonghong/article/details/21527577 我們首先建立一個<List.h>頭文件&#xff0c;聲明一個單鏈表結構&#xff1a; #include "List.h" [cpp] view plaincopy //創建一個單鏈表結構&#xff0c;包含一些常見的操作 …

ffmpeg音視頻基礎知識

ffmpeg音視頻基礎知識前言一、圖像的基礎知識二、視頻編碼基礎知識1.視頻和圖片之間的關系2.為什么要編碼&#xff1f;3.什么是編碼&#xff1f;視頻相關專業術語提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言…

數據結構之單鏈表——C++模板類實現

轉自&#xff1a;http://blog.csdn.net/Mrx_Nh/article/details/60471647 單鏈表定義 [cpp] view plaincopy #ifndef SinglyLinkedListEDLIST_H_INCLUDED #define SinglyLinkedListEDLIST_H_INCLUDED #include <bits/stdc.h> using namespace std; template&l…

Linux系統編程(一)

Linux系統編程&#xff08;一&#xff09;一、進程和程序二、內存布局內核空間用戶空間三、進程狀態四、環境變量五、進程共享一、進程和程序 程序&#xff1a;是指編譯好的二進制文件&#xff0c;存儲在磁盤中&#xff0c;不占用系統資源。 進程&#xff1a;是系統進行資源分…

Linux的SOCKET編程 簡單演示

轉載&#xff1a;http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET編程詳解 1. 網絡中進程之間如何通信 進 程通信的概念最初來源于單機系統。由于每個進程都在自己的地址范圍內運行&#xff0c;為保證兩個相互通信的進 程之間既互不干擾又協調一致工作&a…

Unity(一)必然事件

【MonoBehaviour 類】&#xff08;一&#xff09;必然事件一、必然事件是什么&#xff1f;二、常用函數執行順序1.Awake2.Start3.update4.FixedUpdate三、Awake和start區別一、必然事件是什么&#xff1f; 在Unity中必然事件也稱腳本生命周期&#xff0c;是指在Unity腳本在喚醒…

正則匹配函數

轉載&#xff1a;http://blog.csdn.net/ithomer/article/details/6130806 1.int regcomp(regex_t *compiled, const char *pattern, int cflags) 這個函數把指定的規則表達式pattern編譯成一種特定的數據格式compiled&#xff0c;這樣可以使匹配更有效。函數regexec會使用這個數…

Linux系統編程(二)孤兒進程和僵尸進程

Linux系統編程&#xff08;二&#xff09;一、exec函數族1.exec函數二、孤兒進程和僵尸進程三、wait和waitpid1.wait函數2.waitpid函數一、exec函數族 exec函數使用時&#xff0c;改程序的用戶空間的代碼和數據會被新程序給替代&#xff0c;會從新程序的啟動例程開始。調用exe…

linux下c/c++實例之十socket簡單應用

轉自&#xff1a;http://blog.csdn.net/taiyang1987912/article/details/49738351 一、簡介 通過socket掃描本機打開的tcp端口號&#xff0c;模擬用戶名、密碼登錄服務器的過程、socket文件傳輸及模仿http服務器。 二、詳解 1、Linux下tcp端口掃描 &#xff08;1&#xff09;…

Linux系統編程(三)進程間的通信

Linux系統編程&#xff08;三&#xff09;進程間的通信一、為什么需要進程之間的通信&#xff08;IPC&#xff09;&#xff1f;二、管道1.概念2.特質3.原理4.局限性5.代碼2.讀入數據三、共享存儲映射注意事項父子進程通信一、為什么需要進程之間的通信&#xff08;IPC&#xff…

使用mmap實現大文件的復制:單進程與多進程情況

單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09; mmap實現大文件的復制單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09;一、單線程實現二、多進程實現一般文件實現方法&#xff1a;1.讀取&#xff08;fread&#xff09;要復制的文件2.寫入&#…

exec 函數族

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系統編程之進程&#xff08;五&#xff09;&#xff1a;exec系列函數&#xff08;execl,execlp,execle,execv,execvp)使用 本節目標&#xff1a; exec替換進程映像exec關聯函數組&#xff08;execl、execl…

Linux系統編程(四)信號

Linux系統編程&#xff08;四&#xff09;信號一、什么是信號&#xff1f;1、信號的本質2、信號來源硬件來源軟件來源二、常見信號1.可靠信號和不可靠信號2、不可靠信號主要有以下問題:3、可靠信號與不可靠信號注冊機制三、信號處理方式四、信號處理過程五、未決信號和阻塞信號…

SIGCHLD信號回收子進程

SIGCHLD信號回收子進程代碼問題注意點代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系統編程之進程&#xff08;六&#xff09;&#xff1a;父進程查詢子進程的退出,wait,waitpid 本節目標&#xff1a; 僵進程SIGCHLDwaitwaitpid 一&#xff0c;僵尸進程 當一個子進程先于父進程結束運行時…

Linux系統編程(五)時序競態

時序競態產生原因改進總結產生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void catch_sigalrm(int signo) {printf("…