Wie kann ich wieder binden eine Steckdose in MacOSX / Ubuntu? Ein zweites Mal
-
25-09-2019 - |
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?
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