我正在尝试将该功能getaddrinfo
与被动套接字/侦听器一起使用,而不是直接填充旧sockaddr
结构。我的目的是打开一个套接字并将其绑定到一个端口。本质上我正在构建一个服务器。
我不知道为什么但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;
}
}