PDA

Visualizza la versione completa : [C] Opzione TIMEOUT su risposta server


rschirin
03-01-2012, 13:54
continuo a girare intorno ad un problema. un mio client ha bisogno di una risposta dal server. il server può però simulare un errore BLOCCO che lo rende praticamente inutilizzabile. a questo punto il mio client resterebbe bloccato sulla recv. c'è un modo per inserire un intervallo di tempo d'attesa?per esempio 10 secondi.

LeleFT
03-01-2012, 15:56
Magari occorre specificare almeno il linguaggio di programmazione usato, visto che è obbligatorio come da Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Inoltre, sarebbe opportuno postare la parte di codice interessata dal problema, all'interno degli appositi tag CODE, sempre come specificato nel regolamento...


Ciao. :ciauz:

rschirin
03-01-2012, 17:06
chiedo scusa, altre volte ho aperto discussioni in modo conforme al regolamento, ma stavolta mi è proprio sfuggito!
il linguaggio è il C. LeleFT, potresti modificare il titolo gentilmente?

per quanto riguarda il codice, è una cosa abbastanza semplice. questo è il mio lato client, che usa una recv bloccante.
il server potrebbe generare un errore bloccante, quindi non invierà mai una risposta al client che resterà bloccato.
vorrei perciò mettere una specie di timer sul client per poterlo liberare.


while(1){
ris=recv(serverfd,risInf.buf+ris,sizeof(risInf.buf ),0);
if (ris<=0){break;}/*non riceve più nulla quindi può uscire da questo while altrimenti fa di nuovo la recv*/
}

LeleFT
03-01-2012, 18:17
Originariamente inviato da rschirin
il linguaggio è il C. LeleFT, potresti modificare il titolo gentilmente?


Fatto.


Ciao. :ciauz:

rschirin
10-01-2012, 22:02
nessuna possibile soluzione?

rschirin
12-01-2012, 01:49
se mai qualcuno fosse interessato, basta usare setsockopt con il flag SO_RCVTIMEO e specificare una struttura timeval con i valori voluti.

struct timeval tv; /* struttura definita per INACTIVITY_TIMEOUT_SECONDS */
tv.tv_sec = 10;
tv.tv_usec = 0;
if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv))
{
perror("setsockopt");
return -1;
}

questo prima che venga fatta la connect

Loading