2009년 8월 21일 금요일

SO_REUSEADDR에 대하여

Server Program시 말그대로 이미 사용중인 Address에 대한 Bind 를 가능하게 하는 Option이다.
간혹 Server Program의 Terminate 를 통해 비정상적인 Socket의 Close가 발생하면,

해당 Address/port의 상태가 TIME_WAIT의 상태로 전이가 되어있다. 이때 이 Option을 사용하지 않으면, Bind가 불가능 하게 된다.

*주의할점 : 비정상적인 Packet이 유입될 가능성이 있다.

*예제코드 :

server_sockfd = socket( AF_INET, SOCK_STREAM, 0 );
if(server_sockfd == -1)
{
printf("Create socket Error\n");
exit(0);
}

int option = 1;
setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
// fcntl( server_sockfd, F_SETFL, O_NONBLOCK );// FASYNC );
if(bind( server_sockfd, (struct sockaddr*)&server_address, server_len ) != 0)
{
printf("Bind Error\n");
exit(0);
}