2010-02-02 17 views
0

J'ai le code suivant:Comment relier une socket dans MacOSX/Ubuntu? Une deuxième fois

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"; 
} 

Quand je ferme le serveur, avec près(), de couse, je ne peux pas ouvrir à nouveau le serveur dans le même port. Pourquoi? J'ai besoin de changer le port OU redémarrer le système. Cela n'arrive que dans Ubuntu ET MacOSX. Dans Windows, je n'ai pas ce problème.

L'erreur s'est produite dans la fonction :: bind(). Cela ne me permet pas de re-bind() une socket deux fois.

Comment se reconnecter?

Répondre

4

Vous devez transmettre 1, pas 0, à REUSEADDR.

De la page man 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

Merci! Je l'ai fait. Cela a fonctionné parfaitement pour MacOS, MAIS Ubuntu a toujours le même problème. Rien n'a changé. –