【发布时间】:2013-01-21 14:37:43
【问题描述】:
我正在尝试将函数 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;
}
}
【问题讨论】:
-
好吧,手册页说:“返回一个或多个 addrinfo 结构”。您应该在两个结果中选择正确的一个。
-
谢谢,不。这将解决并完成我的工作!
标签: c linux sockets networking getaddrinfo