gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:03 25 4
gpt4 key购买 nike

我正在尝试将函数 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com