回送地址

回送地址

回送地址(127.x.x.x)是本機回送地址(Loopback Address),即主機IP堆疊內部的IP位址,主要用於網路軟體測試以及本地機進程間通信,無論什麼程式,一旦使用回送地址傳送數據,協定軟體立即返回之,不進行任何網路傳輸。

基本介紹

  • 中文名:回送地址
  • 定義:本機回送地址
  • 套用於:網路軟體測試和本地機進程間通信
  • 套用範圍:任何程式
操作方法,實際套用,編譯,分析,活動,解析,

操作方法

在“運行”程式中輸入“cmd”命令,然後在彈出的對話框中輸入“ping 127.x.x.x”,再按回車鍵。如ping127.0.0.1

實際套用

我們分兩部分介紹如下:
一、我們可以Ping回送地址。通常如果回送地址Ping不通,就說明IP堆疊出了故障。如果通的話,表明網路出了問題。
例如:我們在命令行運行ping127.0.0.1,以檢查主機的TCP/IP協定是否安裝並正常工作,如下:
c:\>ping127.0.0.1
Pinging127.0.0.1with 32 bytes of data:
Reply from127.0.0.1: bytes=32 time<1ms TTL=128
Reply from127.0.0.1: bytes=32 time<1msTTL=128
Reply from127.0.0.1: bytes=32 time<1ms TTL=128
Reply from127.0.0.1: bytes=32 time<1ms TTL=128
Ping statistics for127.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 <jamescfoster@ >
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連線。最後,兩個程式都將關閉連線並終止。

活動

1(foster@syngress ~/book) $ ./server1 4001 &
2./server1 4001 & [1] 31802
3
4(foster@syngress ~/book) $ ./client1127.0.0.14001
5 ./client1127.0.0.14001
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。
● 第5行,TCSH shell列印用戶輸入的命令。
● 第7行,server1列印一條信息,表示它收到客戶端的TCP連線,即client1發起的連線。
● 第9行,client1列印信息表明已經建立了到server1的連線。
上面演示了127.x.x.x在TCP和UDP套接字編程中的套用。

相關詞條

熱門詞條

聯絡我們