新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - 编程开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
首页 > 百科 > 技术 > 正文

回送地址

新客网 XKER.COM 2007-11-04 收藏本文
    回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,从进行任何网络传输。
    我们分两部分介绍如下:
    一、我们可以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 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套接字编程中的应用

收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。