Comment puis-je re-lier un socket dans MacOSX / Ubuntu? Une seconde fois
-
25-09-2019 - |
Question
Je le code suivant:
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? Je dois changer le port ou redémarrer le système. Il arrive que dans Ubuntu et MacOSX. Sous Windows Je n'ai pas ce problème.
L'erreur happend dans la fonction :: bind (). Il ne me permet pas de re-bind () une prise deux fois.
Comment puis-je re-bind?
La solution
Vous devez passer 1, 0, à REUSEADDR.
A partir 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow