1. 程式人生 > >127.0.0.1 + 回送地址

127.0.0.1 + 回送地址

編輯本段操作方法

  在“執行”程式中輸入“cmd”命令,然後再彈出的對話方塊中輸入“ping 127.x.x.x”,再按回車鍵。

編輯本段實際應用

  我們分兩部分介紹如下:   一、我們可以Ping回送地址。通常如果回送地址Ping不通,就說明IP堆疊出了故障。如果不通的話,表明網路出了問題。   例如:我們在命令列執行ping 127.0.0.1 ,以檢查主機的TCP/IP協議是否安裝並正常工作,如下:   c:\>ping 127.0.0.1   Pinging 127.0.0.1 with 32 bytes of data:   Reply from 127.0.0.1: bytes=32 time<1ms TTL=128   Reply from 127.0.0.1: bytes=32 time<1ms

27.0.0.1用於測試回送(loopback)地址

[1]  TTL=128   Reply from 127.0.0.1: bytes=32 time<1ms TTL=128   Reply from 127.0.0.1: bytes=32 time<1ms TTL=128   Ping statistics for 127.0.0.1:   Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),   Appro\eximate round trip time= in milli-seconds:   Minimum = 0ms, Maximum = 0ms, Average = 0ms   c:\>   二、主要用於網路軟體測試以及本地機程序間通訊,無論什麼程式,一旦使用回送地址傳送資料,例如我們可以IP地址127.0.0.1和埠4001作為引數執行程式。127.0.0.1是一個回送地址,被分配給回送介面。回送介面是一個僅能被本地主機上執行的程式所訪問的邏輯介面。實際上大部分系統都將localhost作為127.0.0.1的別名。測試例項如下:   TCP伺服器(server1. c)   1 /*   2 * server1.c   3 *   4 * Create TCP server socket, accept   5 * one TCP client connection using   6 * socket(), bind(), listen() and   7 * accept().   8 *   9 * foster <[email protected]>   10 */   11   12 #include <stdio.h>   13 #include <sys/types.h>   14 #include <sys/socket.h>   15 #include <netinet/in.h>   16   17 int   18 main (int argc, char *argv[])   19 {   20 struct sockaddr_in sin ;   21 struct sockaddr_in csin;   22 socklen_t len = sizeof(struct sockaddr);   23 short port = 0;   24 int csock = 0;   25 int sock = 0;   26 int ret = 0;   27   28 if(argc != 2)   29 {   30 printf("usage: %s: port\n", argv[0]);   31 return(1);   32 }   33   34 port = atoi(argv[1]);   35   36 sock = socket(AF_INET, SOCK_STREAM, 0);   37 if(sock < 0)   38 {   39 printf("TCP server socket() failed.\n");   40 return(1);   41 }   42   43 memset(&sin, 0x0, sizeof(struct sockaddr_in *));   44   45 sin.sin_family = AF_INET;   46 sin.sin_port = htons(port);   47 sin.sin_addr.s_addr = INADDR_ANY;   48   49 ret = bind(sock, (struct sockaddr *)&sin,   50 (struct sockaddr));   51 if(ret < 0)   52 {   53 printf("TCP server bind() failed.\n");   54 close (sock);   55 return(1 );   56 }   57   58 ret = listen(sock, 5);   59 if(ret < 0)   60 {   61 printf("TCP server listen() failed.\n");   62 close (sock);   63 return(1 );   64 }   65   66 printf("TCP server listening.\n");   67   68 memset(&csin, 0x0, sizeof(struct sockaddr));   69   70 csock = accept(sock, (struct sockaddr *)&csin, &len);   71 if(csock < 0)   72 {   73 printf("TCP server accept() failed.\n");   74 }   75 else   76 {   77 printf("TCP server: TCP client connection " \   78 "on port %d.\n", port);   79 close(csock);   80 }   81   82 close(sock);   83   84 return(0);   85 }

編輯本段
編譯

  (foster@syngress ~/book) $ gcc -o server1 server1.c   (foster@syngress ~/book) $ ./server1   usage: ./server1: port   執行   (foster@syngress ~/book) $ ./server1 4001   TCP server listening.   server1.c是一個簡單的TCP伺服器程式,它只帶有一個命令列引數表示埠號,伺服器將在這個埠上監聽遠端客戶端的連線。程式首先呼叫socket( )函式分配一個套接字識別符號,然後繫結到指定的埠並呼叫accept( )函式進行監聽,這個函式將等待客戶端的連線。收到客戶端的連線以後,與TCP客戶端的連線以及伺服器端套接字被關閉,程式終止。

編輯本段
分析

  ● 第36行,程式呼叫socket( )函式分配套接字識別符號,將AF_INET作為域引數傳遞,表示該套接字使用IP協議;將SOCK_STREAM作為類引數傳遞,表示該套接字在傳輸層使用TCP協議進行通訊;將0傳遞給作為協議引數傳遞,因為在分配TCP套接字的時候,通常不會用到這個引數。   ● 第43行,初始化sockaddr_in結構,用來定義套接字將要繫結的本地端點。   ● 第45行,本地端點的family域被指定為AF_INET,與第36行傳給socket( )函式的引數一致。   ● 第46行,指定將要繫結的本地埠,埠號由命令列引數給出並作為字元陣列(char *)傳遞進來。埠號通過atoi( )函式被轉換成4位元組的整型數,然後再轉換為網路位元組順序的2位元組短整型數,最後賦值給sockaddr_in結構的sin_port成員。   ● 第47行,指定要繫結的本地IP地址。這裡用到了無符號整型常量INADDR_ANY,這個值表示套接字將會繫結到所有可用的網路介面,包括回送介面(loopback interface)。與INADDR_ANY相反,在主機有多個網路介面的情況下,如果用指定網路介面的IP地址代替INADDR_ANY,則可以將套接字繫結到其中的一個介面。   ● 第49行,呼叫bind( )函式指定本地端點的資訊,包括本地IP地址、埠以及套接字描述符。   ● 第58行,呼叫listen( )函式,指定在拒絕新連線以前,可排除等待的TCP客戶端連線請求的數目,並且指定套接字已經就緒,可以接收客戶端的連線。程式從這裡開始處理客戶端的連線。   ● 第70行,呼叫accept( )函式接收TCP客戶端的連線請求,accept( )函式被呼叫時,將會等待(阻塞)客戶端的連線。當收到一個新的TCP客戶端請求以後,accept( )函式將返回一個套接字描述符來代表這個新的連線。   ● 第79行,關閉由accept( )函式返回的合法套接字描述符。   ● 第82行,關閉伺服器端套接字,不再允許客戶端的連線。   下面,我們首先執行程式server1,接著再執行程式client1。server1將分配一個套接字描述符,並繫結到命令列指定的埠,然後監聽來自客戶端的TCP連線。當執行client1時,將會在server1和client1兩個程式之間建立一個TCP連線。最後,兩個程式都將關閉連線並終止。

編輯本段TCP客戶端與伺服器的活動

  1(foster@syngress ~/book) $ ./server1 4001 &   2./server1 4001 & [1] 31802   3   4(foster@syngress ~/book) $ ./client1 127.0.0.1 4001   5 ./client1 127.0.0.1 4001   6   7 TCP server: TCP client connection on port 4001.   8   9 TCP client connected.   10   11 [1] Done ./server1 4001

編輯本段解析

  server1執行時指令繫結4001號TCP埠,並在該埠進行監聽。在大部分作業系統上,1到1024號埠限制為僅供具有特定許可權的程式使用,所以在這個示例裡面使用了大於1024的埠。命令列末尾的&符號表示程式將作為後臺程序執行,所以會立即返回到命令提示符以便執行client1程式。   ● 第1行,TCSH shell打印出使用者輸入的命令。   ● 第2行,TCSH shell列印server1後臺程序的程序ID。   ● 第4行,以IP地址127.0.0.1和埠4001作為引數執行程式client1。127.0.0.1是一個回送地址,被分配給回送介面。回送介面是一個僅能被本地主機上執行的程式所訪問的邏輯介面。實際上大部分系統都將localhost作為127.0.0.1的別名。   ● 第5行,TCSH shell列印使用者輸入的命令。   ● 第7行,server1列印一條資訊,表示它收到客戶端的TCP連線,即client1發起的連線。   ● 第9行,client1列印資訊表明已經建立了到server1的連線。   上面演示了127.x.x.x在TCP和UDP套接字程式設計中的應用