回送地址(127.x.x.x)-----本機回送地址(LoopbackAddress),即主機IP堆疊內部的IP位址,主要用於網路軟體測試以及本地機進程間通信,無論什麼程式,一旦使用回送地址傳送數據,協定軟體立即返回之,從進行任何網路傳輸。
介紹
一、我們可以Ping回送地址。通常如果回送地址Ping不同,就說明IP堆疊出了故障。如果不通的話,表明網路出了問題。
例如:我們在命令行運行ping127.0.0.1,以檢查主機的TCP/IP協定是否安裝並正常工作,如下:
c:\>ping127.0.0.1
Pinging127.0.0.1with32bytesofdata:
Replyfrom127.0.0.1:bytes=32time
二、主要用於網路軟體測試以及本地機進程間通信,無論什麼程式,一旦使用回送地址傳送數據,例如我們可以IP位址127.0.0.1和連線埠4001作為參數執行程式。127.0.0.1是一個回送地址,被分配給回送接口。回送接口是一個僅能被本地主機上運行的程式所訪問的邏輯接口。實際上大部分系統都將localhost作為127.0.0.1的別名。
測試實例
TCP伺服器(server1.c)
1/*
2*server1.c
3*
4*CreateTCPserversocket,accept
5*oneTCPclientconnectionusing
6*socket(),bind(),listen()and
7*accept().
8*
9*foster
10*/
11
12#include
13#include
14#include
15#include
16
17int
18main(intargc,char*argv[])
19{
20structSOCKADDR_INsin;
21structsockaddr_incsin;
22socklen_tlen=sizeof(structsockaddr);
23shortport=0;
24intcsock=0;
25intsock=0;
26intret=0;
27
28if(argc!=2)
29{
30printf("usage:%s:port\n",argv[0]);
31return(1);
32}
33
34port=atoi(argv[1]);
35
36sock=socket(AF_INET,SOCK_STREAM,0);
37if(sock<0)
38{
39printf("TCPserversocket()failed.\n");
40return(1);
41}
42
43memset(&sin,0x0,sizeof(structsockaddr_in*));
44
45sin.sin_family=AF_INET;
46sin.sin_port=htons(port);
47sin.sin_addr.s_addr=INADDR_ANY;
48
49ret=bind(sock,(structsockaddr*)&sin,
50(structsockaddr));
51if(ret<0)
52{
53printf("TCPserverbind()failed.\n");
54close(sock);
55return(1);
56}
57
58ret=listen(sock,5);
59if(ret<0)
60{
61printf("TCPserverlisten()failed.\n");
62close(sock);
63return(1);
64}
65
66printf("TCPserverlistening.\n");
67
68memset(&csin,0x0,sizeof(structsockaddr));
69
70csock=accept(sock,(structsockaddr*)&csin,&len);
71if(csock<0)
72{
73printf("TCPserveraccept()failed.\n");
74}
75else
76{
77printf("TCPserver:TCPclientconnection"\
78"onport%d.\n",port);
79close(csock);
80}
81
82close(sock);
83
84return(0);
85}
編譯
(foster@syngress~/book)$gcc-oserver1server1.c
(foster@syngress~/book)$./server1
usage:./server1:port
執行
(foster@syngress~/book)$./server14001
TCPserverlistening.
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,這個值表示套接字將會綁定到所有可用的網路接口,包括回送接口(loopbackinterface)。與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)$./server14001&
2./server14001&[1]31802
3
4(foster@syngress~/book)$./client1127.0.0.14001
5./client1127.0.0.14001
6
7TCPserver:TCPclientconnectiononport4001.
8
9TCPclientconnected.
10
11[1]Done./server14001
分析:
server1執行時指令綁定4001號TCP連線埠,並在該連線埠進行監聽。在大部分作業系統上,1到1024號連線埠限制為僅供具有特定許可權的程式使用,所以在這個示例裡面使用了大於1024的連線埠。命令行末尾的&符號表示程式將作為後台進程運行,所以會立即返回到命令提示符以便執行client1程式。
第1行,TCSHshell列印出用戶輸入的命令。
第2行,TCSHshell列印server1後台進程的進程ID。
第4行,以IP位址127.0.0.1和連線埠4001作為參數執行程式client1。127.0.0.1是一個回送地址,被分配給回送接口。回送接口是一個僅能被本地主機上運行的程式所訪問的邏輯接口。實際上大部分系統都將localhost作為127.0.0.1的別名。
第5行,TCSHshell列印用戶輸入的命令。
第7行,server1列印一條信息,表示它收到客戶端的TCP連線,即client1發起的連線。
第9行,client1列印信息表明已經建立了到server1的連線。
上面演示了127.x.x.x在TCP和UDP套接字編程中的套用
參考資料:
[1]http://www.chinadomain.com.cn/