특정 소켓에서 들어오는 연결을 수신하기 위해 새 소켓을 컴퓨터의 주소에 바인딩하도록 설계된 코드를 만들었습니다. 나는 getaddrinfo를 사용하고있다. 이것이 최선의 방법입니까? 그것은 무의미한 포트 정수를 문자열로 변환하는 것처럼 보입니다. sprintf가 필요없이이 작업을 수행 할 수있는 방법이 있습니까? getaddrinfo()
는 일반적으로 AI_PASSIVE
상태에서 어떻게 사용되는지 상당히 관용적 보이는소켓을 컴퓨터의 주소에 바인딩하여 수신 대기
bool CBSocketBind(void * socketID,u_int16_t port){
struct addrinfo hints,*res,*ptr;
int socketIDInt;
// Set hints for the computer's addresses.
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
// Get host for listening
char portStr[6];
sprintf(portStr, "%u",port);
if (getaddrinfo(NULL, portStr, &hints, &res) != 0)
return false;
// Attempt to bind to one of the addresses.
for(ptr = res; ptr != NULL; ptr = ptr->ai_next) {
if ((socketIDInt = socket(ptr->ai_family, ptr->ai_socktype,ptr->ai_protocol)) == -1)
continue;
if (bind(socketIDInt, ptr->ai_addr, ptr->ai_addrlen) == -1) {
close(socketIDInt);
continue;
}
break; // Success.
}
freeaddrinfo(res);
if (ptr == NULL) // Failure
return false;
socketID = malloc(sizeof(int));
*(int *)socketID = socketIDInt; // Set socket ID
// Make socket non-blocking
fcntl(socketIDInt,F_SETFL,fcntl(socketIDInt,F_GETFL,0) | O_NONBLOCK);
return true;
}
감사합니다. 좋은 대답. –