首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >环回接口上的客户端服务器连接

环回接口上的客户端服务器连接
EN

Stack Overflow用户
提问于 2013-03-14 21:51:40
回答 4查看 5.1K关注 0票数 1

我正在尝试测试一个使用本地主机地址的客户端-服务器简单实现。这是代码。

服务器:

代码语言:javascript
复制
/*
 * Sequential busy-waiting
 */
int main(int argc, char** argv) {

    int opt, client_addr_l, errsv;
    unsigned short port;
    struct sockaddr_in server_addr, client_addr;

    /* ... */

    printf("Port number retrieved (%d), server is starting ...\n", port);

    /*TCP Socket creation*/
    sock_ds = socket(AF_INET, SOCK_STREAM, 0); 
    if(sock_ds == -1){
        fprintf(stderr, "Socket creation error: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    /*Server address binding*/
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = INADDR_ANY;

   /*!!!! */
   int optval = 1;                                      
   if( (setsockopt(sock_ds,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval))) == -1 ) {                
       printf("Error on setsockopt\n");                         
       exit(EXIT_FAILURE);                                  
   }
  /*????*/

   if(bind(sock_ds, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
       fprintf(stderr, "Address binding error\n");
       exit(EXIT_FAILURE);
   }

   /*Server with passive socket*/
   if(listen(sock_ds, SOMAXCONN) == -1){
       fprintf(stderr, "Listen call error: %s\n", strerror(errno));
       exit(EXIT_FAILURE);
   }

   while(1){
       memset(&client_addr, 0, sizeof(client_addr));
       acc_sock_ds = accept(sock_ds, (struct sockaddr *)&client_addr, &client_addr_l);
       printf("DEBUG: LINE201, acc_sock_ds = %d\n", acc_sock_ds);
       /*Connect error management*/
       if(acc_sock_ds == -1){
           fprintf(stderr, "Fatal error on accept %d(%s)\n"
                   , errsv, strerror(errsv));
            exit(EXIT_FAILURE);
       }

       //sin_addr to ASCII (string) );
       printf("Connected with: %s\n", inet_ntoa(client_addr.sin_addr)); 

       /*...*/     

       close(acc_sock_ds);

      /*...*/
    }

/*...*/

}

客户端:

代码语言:javascript
复制
 int main(){

    int sock_ds;
    struct sockaddr_in remote_addr;
    struct hostent *hp;

    /*TCP Socket creation*/
    sock_ds = socket(AF_INET, SOCK_STREAM, 0); 
    if(sock_ds == -1){
        fprintf(stderr, "Socket creation error\n");
        exit(EXIT_FAILURE);
    }

    remote_addr.sin_family = AF_INET;
    remote_addr.sin_port = htons(25556);

    hp = gethostbyname("localhost");
    bcopy(hp -> h_addr, &remote_addr.sin_addr, hp -> h_length); //fills address entry

   if(connect(sock_ds, (struct sockaddr*)&remote_addr, sizeof(remote_addr)) == -1){ //connection attempt
       fprintf(stderr, "Connect failure(%s)\n", strerror(errno));
       exit(EXIT_FAILURE);        
   }

   /*...*/

}

当我在两个不同的终端上运行它们时,服务器返回给我:

代码语言:javascript
复制
Port number retrieved (25556), server is starting ...
Server is ready. Waiting for client connections.
DEBUG: LINE201, acc_sock_ds = 4
Connected with: 0.0.0.0

我的问题是:为什么服务器检索到的客户端地址是0.0.0.0。它不应该是127.0.0.1?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-14 22:29:40

看起来您传递的是第三个参数接受()未初始化,它应该设置为第二个参数的大小。除此之外,它应该是一个整数,而不是一个socklen_t,请参见http://pubs.opengroup.org/onlinepubs/009695399/functions/accept.html

可以尝试将client_addr_l声明为socklen_t,然后将其设置为sizeof(结构sockaddr_in),然后传递给accept()?

我猜它的统一化值是零,因此accept()不能将远程地址设置为您的client_addr,因为它的大小为零。因此,client_addr是原封不动的,正如您之前将其置零一样,您得到的是0.0.0.0。

票数 1
EN

Stack Overflow用户

发布于 2013-03-14 21:53:20

0.0.0.0表示您的服务器接受来自设备中任何接口的连接

因此,地址为127.0..0.1的环回接口也包括在内

票数 1
EN

Stack Overflow用户

发布于 2013-03-14 21:55:02

这似乎是一种特殊的情况。所有可能的地址都在侦听您的连接。Here就是这方面的一个线索。

引用:

代码语言:javascript
复制
0.0.0.0, in this context, means "all IP addresses on the local machine" 
(in fact probably, "all IPv4 addresses on the local machine"). 
So, if your webserver machine has two ip addresses, 192.168.1.1 and 10.1.2.1, 
and you allow a webserver daemon like apache to listen on 0.0.0.0, 
it will be reachable at both of those IPs. 
But only to what can contact those IPs and the web port(s).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15411205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档