标题：回送地址
操作方法
在“运行”程序中输入“cmd”命令，然后再弹出的对话框中输入“ping 127.x.x.x”，再按回车键。如ping 127.0.0.1
实际应用
我们分两部分介绍如下：
一、我们可以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)地址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 <jamescfoster@gmail.com>
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套接字编程中的应用