2012-11-26 10 views
5

Ho alcuni problemi a capire il funzionamento dei socket in Linux.Come è possibile avere un timeout di invio su un socket non bloccante?

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int)); 
write = write(sockfd, buf, len); 

Nel codice precedente come lettura è bufferizzata, invia timeout non ha alcun senso (chiamata di sistema write restituirà immediatamente quando il buffer spazio utente viene copiato nei buffer kernel). La dimensione del buffer di invio è un parametro molto più importante, ma il timeout di invio sembra che non valga nulla. Ma sicuramente ho torto, visto che ho visto un bel po 'di codice che usa SO_SNDTIMEO. Come può il timeout del codice spazio utente utilizzare SO_SNDTIMEO assumendo che il ricevitore sia molto lento?

+0

Potete chiarire quale risultato si sta tentando di ottenere? –

+2

Non c'è alcun risultato che sto cercando di raggiungere, ho posto questa domanda per capire il funzionamento dei socket e in particolare perché SO_SNDTIMEO esiste anche? – 0xhacker

+0

Questa risposta può aiutarti a capire SO_SNDTIMEO: http://stackoverflow.com/a/4182564/10682 –

risposta

6

Come è possibile avere un timeout di invio su una presa non bloccante?

Non lo è. I timeout sono per la modalità di blocco. Uno recv() non bloccante non bloccherà e pertanto non può scadere.

Ho visto un sacco di codice che utilizza SO_SNDTIMEO.

Non in modalità non bloccante a meno che il codice in questione non abbia senso.

+0

In Linux come ci si assicura che l'invio o la scrittura di un pacchetto stia bloccando, ad es. scrivere o inviare resi solo quando il kernel ha ricevuto l'ACK per l'intera lunghezza del buffer (il buffer verrà suddiviso in più pacchetti TCP) – 0xhacker

+0

@ mc_87 Non è possibile. Se si desidera un riconoscimento, è necessario inviarne uno a livello di applicazione. – EJP

+0

Quindi, come sarà utile SO_SNDTIMEO se a livello di applicazione non riesco a bloccare fino all'ultimo mio tcp ack? – 0xhacker

4

SO_SNDTIMEO è utile per un socket di blocco. Se il buffer del socket è pieno, send() può bloccare, nel qual caso potrebbe essere utile usare l'opzione socket SO_SNDTIMEO. Per i socket non bloccanti, se il buffer del socket è pieno, l'invio fallirà immediatamente, quindi non è necessario impostare SO_SNDTIMEO con un socket non bloccante.

Problemi correlati