环回接口上的客户端服务器连接 [英] Client server connection on loopback interface

查看:62
本文介绍了环回接口上的客户端服务器连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to test a client-server simple implementation using localhost address. Here's the code.

服务器:

/*
 * 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);

      /*...*/
    }

/*...*/

}

客户:

 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);        
   }

   /*...*/

}

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

When i run them on two different terminals server returns me:

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吗?

My question is: why does the client address retrieved by the server is 0.0.0.0. It should not be 127.0.0.1?

推荐答案

您似乎将第三个参数传递给未初始化的accept(),应该将其设置为第二个参数的大小.除此之外,它应该是socklen_t,而不是int,请参见 http://pubs.opengroup.org/onlinepubs/009695399/functions/accept.html

It looks like you are passing the third parameter to accept() uninitialized, it should be set at the size of the second parameter. In addition to that, it should be a socklen_t, not an int, see http://pubs.opengroup.org/onlinepubs/009695399/functions/accept.html

可以尝试通过将client_addr_l声明为socklen_t,然后在传递给accept()之前将其设置为sizeof(struct sockaddr_in)吗?

Could try by declaring client_addr_l as a socklen_t, then setting it to sizeof( struct sockaddr_in) before passing to accept() ?

我猜它的单位化值为零,所以accept()不能将远程地址设置为client_addr,因为它的大小为零.因此,client_addr保持不变,并且在您之前对其进行清零时,您将获得0.0.0.0.

I'm guessing its unitialized value is zero, so accept() cannot set the remote address to your client_addr as it has a zero size. So, client_addr is untouched and, as you zeroed it earlier, you get 0.0.0.0.

这篇关于环回接口上的客户端服务器连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆