Domanda

Esiste un modo in un ambiente Win32 per "mettere a punto" il timeout su una chiamata socket connect () ? In particolare, vorrei aumentare la durata del timeout. Le prese in uso non sono bloccanti. Grazie!

È stato utile?

Soluzione

Sì, questo è possibile.

Se sei in modalità non bloccante dopo connect () , normalmente si utilizza select () per attendere che l'I / O sia pronto. Questa funzione ha un parametro per specificare il valore di timeout e restituirà 0 in caso di timeout.

Altri suggerimenti

È possibile provare a utilizzare le opzioni socket SO_RCVTIMEO e SO_SNDTIMEO per impostare i timeout per qualsiasi operazione socket. Esempio:

struct timeval timeout;      
timeout.tv_sec = 10;
timeout.tv_usec = 0;

if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

Puoi anche provare l'allarme (). Esempio:

signal( SIGALRM, connect_alarm ); /* connect_alarm is you signal handler */
alarm( secs ); /* secs is your timeout in seconds */
if ( connect( fd, addr, addrlen ) < 0 )
{
    if ( errno == EINTR ) /* timeout, do something below */
        ...
}
alarm( 0 ); /* cancel the alarm */

No, questo non è possibile. Il timeout di connessione predefinito può essere ridotto, ma non aumentato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top