c - getaddrinfo 使用 localhost 返回 2 个结果

标签 c linux sockets networking getaddrinfo

我尝试将函数 getaddrinfo 与被动套接字/监听器一起使用,而不是直接填充旧的 sockaddr 结构。 我的目的是打开一个套接字并将其绑定(bind)到一个端口。本质上我正在构建一个服务器。

我不知道为什么,但是 getaddrinfo 返回 2 个结果;因此,在下面的循环中,我第二次调用绑定(bind)时,它退出并显示错误“地址已在使用中”。 您知道如何解决这个问题以及将其放入循环中是否正确吗?

         struct addrinfo addr;
         memset(&addr,0,sizeof(addrinfo));
         addr.ai_family   = AF_INET;
         addr.ai_socktype = SOCK_STREAM;
         addr.ai_protocol = 0;
         addr.ai_flags    = AI_PASSIVE;

         struct addrinfo * rp,* result;
         getaddrinfo( "localhost","59001",&addr,&result );
         for( rp = result; rp != NULL; rp = rp->ai_next ){

              int sd = socket( AF_INET, SOCK_STREAM, 0 );
              if(-1==sd ){ 
              printf( "error creating the socket %m");
              return -1; 
              }             

             if( -1==bind( sd, result->ai_addr, result->ai_addrlen ) ){                 
             printf( "error binding %m")
             return -1;
             }

             if( -1== listen(sd, MAX_BACKLOG ) ){
             std::cerr << "listen didn't work" << std::endl;
             return -1;
             }       
         }

最佳答案

这里发生了一些事情。对于 getaddrinfo() 的多个结果,这是因为它返回一个 IPv4 地址和一个 IPv6 地址(两者都有)。至于“地址已在使用”,需要设置SO_REUSEADDR选项。将其放在对 socket()bind() 的调用之间:

int opval = 1;
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

关于c - getaddrinfo 使用 localhost 返回 2 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14440925/

相关文章:

c - 信号 11(核心转储)

node.js - 为什么在 Node.js 中尝试重新连接 TCP 连接后会收到 ECONNREFUSED 错误?

c - 在 C 中设置 select() 和 write_fds

c - 将 fseek() 与附加一起使用

C pragma omp 并行

C转到不同的功能

c++ - 使用 Linux 伪终端测试 QSerialPort

linux - phpmyadmin, neginx error.log - 检查组 www-data 有读取权限和 open_basedir

java - 安装 Play Framework 1.2.7 时出现问题

Java套接字。服务器-客户端通信