2010-02-02 1 views
0

У меня есть следующий код:Как перенастроить сокет в MacOSX/Ubuntu? Второй раз

if ((m_mainSocket = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 
{ 
    throw Exception(__FILE__, __LINE__) << "Unable to create socket"; 
} 

int on(0); 

if (setsockopt(m_mainSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) 
{ 
    throw Exception(__FILE__, __LINE__) << "Can't make server socket resusable."; 
} 

sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 

addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
addr.sin_port = htons(p_localPort); 

if (::bind(m_mainSocket, reinterpret_cast< sockaddr * >(&addr), sizeof(addr)) < 0) 
{ 
    throw Exception(__FILE__, __LINE__) << "Failed to bind the server socket"; 
} 

Когда я закрываю сервер, с близкими(), из Кауса, я не могу открыть сервер снова в том же порту. Зачем? Мне нужно изменить порт или перезагрузить систему. Это происходит только в Ubuntu и MacOSX. В Windows у меня нет этой проблемы.

Ошибка в функции :: bind(). Это не позволяет мне повторно связать() сокет дважды.

Как мне перевязать?

ответ

4

Вам необходимо передать 1, а не 0, в REUSEADDR.

На странице socket(7) людей:

 
    Socket Options 
     These socket options can be set by using setsockopt(2) and read with 
     getsockopt(2) with the socket level set to SOL_SOCKET for all sockets: 

     .... 

     SO_REUSEADDR 
       Indicates that the rules used in validating addresses supplied 
       in a bind(2) call should allow reuse of local addresses. For 
       AF_INET sockets this means that a socket may bind, except when 
       there is an active listening socket bound to the address. When 
       the listening socket is bound to INADDR_ANY with a specific port 
       then it is not possible to bind to this port for any local 
       address. Argument is an integer boolean flag. 
+0

Спасибо! Я сделал это. Он отлично работал для MacOS, но Ubuntu по-прежнему имеет ту же проблему. Ничего не изменилось. –