sockaddr
구조를 직접 채우지 않고 수동 소켓/수신기와 함께 getaddrinfo
함수를 사용하려고합니다. 내 목적은 소켓을 열고 포트에 바인딩하는 것입니다. 본질적으로 저는 서버를 만들고 있습니다.getaddrinfo는 localhost를 사용하여 2 개의 결과를 반환합니다.
왜 그런지 모르겠지만 getaddrinfo
은 (는) 검색 결과 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;
}
}
음을 참조 맨 페이지는 말한다 : "하나 개 이상되는 addrinfo 구조를 반환합니다." 두 가지 결과 중 올바른 것을 골라야합니다. –
감사합니다. 이것은 고쳐지고 내 일을 끝내게됩니다! –