setsockopt



  • Ich würde mal gerne wissen, was man genau eintragen muss für setsockopt, da Windows bekanntlich ewig braucht bis man eine Antwort ( connected oder TimeOut ) hat, ich will z.B. das er per connect nur 1 mal nachfragt und nicht 3 mal.

    Eine Alternative zu close(int d); für Windows wäre auch nicht schlecht....



  • also ich nutze es so

    char optval = 1;
    if ( setsockopt (ListenSocket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof (optval)) < 0)
    {
    	fprintf (stderr,"setsockopt(): Fehler bei setsockopt()\n");
    }
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Mit ioctlsocket den socket in den async Modus vesetzen, dannach mit connect den Verbindungsaufbau starten und danach mit select (mit deinem angegebenen Timeout) auf die erfolgreiche Verbindung warten

    eine Alternative für close(socket) wäre shutdown um einfach die Verbindung abzubrechen aber den socket nicht zu schließen



  • Könntest du vielleicht etwas Code posten, das würde deine Antwort etwas "beispielhafter" machen...



  • SOCKET nFDSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( nFDSocket == SOCKET_ERROR )
    {
    	// fehler
    }
    
    unsigned long nValue;
    
    // in den non-blocking modus setzen
    nValue = true;
    if( ioctlsocket( nFDSocket, FIONBIO, &nValue ) == SOCKET_ERROR )
    {
    	// fehler
    }
    
    sockaddr_in Addr			= { 0 };
    Addr.sin_family				= AF_INET;
    Addr.sin_addr.S_un.S_addr	= inet_addr( "192.168.0.1" );
    Addr.sin_port				= htons( 135 );
    if( connect( nFDSocket, (sockaddr*)&Addr, sizeof( Addr ) ) == SOCKET_ERROR &&
    	WSAGetLastError() != WSAEWOULDBLOCK )
    {
    	// fehler
    }
    
    FD_SET FDSet;
    FD_ZERO( &FDSet );
    FD_SET( nFDSocket, &FDSet );
    // 2.500 Sekunden
    timeval Timeout;
    Timeout.tv_sec	= 2;
    Timeout.tv_usec = 500;
    int nStatus = select( 1, NULL, &FDSet, NULL, &Timeout );
    if( nStatus == SOCKET_ERROR )
    {
    	// fehler
    }
    else if( nStatus == 0 )
    {
    	// timeout
    }
    // wieder in den blocking modus setzen
    nValue = false;
    if( ioctlsocket( nFDSocket, FIONBIO, &nValue ) == SOCKET_ERROR )
    {
    	// fehler
    }
    

Anmelden zum Antworten