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?

Était-ce utile?

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
scroll top