Frage

Ich habe den folgenden Code:

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

Wenn ich den Server in der Nähe, mit close (), von couse, kann ich nicht öffnen Sie den Server wieder in den gleichen Port. Warum? Ich brauche den Port zu ändern oder das System neu starten. Es geschieht nur in Ubuntu und MacOSX. In Windows habe ich dieses Problem nicht.

Der Fehler geschieht in dem :: bind () Funktion. Es erlaubt mir nicht, zu binden wieder () eine Buchse zweimal.

Wie kann ich wieder binden?

War es hilfreich?

Lösung

Sie müssen 1 passieren, nicht 0, ReuseAddr.

Von der socket(7) man-Seite:

   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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top