古い構造getaddrinfo
を直接埋めるのではなく、パッシブソケット/リスナーで関数を使用しようとしています。sockaddr
私の目的は、ソケットを開いてポートにバインドすることです。基本的に私はサーバーを構築しています。
理由はわかりませんが、getaddrinfo
2 つの結果が返されます。このため、2回目にバインドを呼び出すと、「アドレスは既に使用されています」というエラーで終了します。これを修正する方法と、それをループにするのが正しいかどうかを知っていますか?
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;
}
}