È consigliabile/sicuro per close()
un socket direttamente dopo l'ultimo send()
?close() socket direttamente dopo send(): non sicuro?
So che TCP dovrebbe cercare di recapitare tutti i dati rimanenti nel buffer di invio anche dopo aver chiuso il socket, ma posso davvero contare su questo?
Mi sto assicurando che non ci siano dati rimanenti nel mio buffer di ricezione in modo che nessun RST verrà inviato dopo la mia chiusura.
Nel mio caso, la chiusura è in realtà l'ultima dichiarazione del codice prima di chiamare exit()
.
Lo stack TCP continuerà effettivamente a provare a trasmettere i dati anche dopo che il processo di invio è terminato? È affidabile come aspettare un timeout arbitrario prima di chiamare close()
impostando SO_LINGER?
Cioè, si applicano gli stessi timeout TCP o sono più brevi? Con un grande buffer di invio e una connessione lenta, il tempo per trasferire effettivamente tutti i dati memorizzati nel buffer potrebbe essere sostanziale, dopo tutto.
Non mi interessa affatto ricevere notifica dell'ultimo byte inviato; Voglio solo che alla fine arrivino all'host remoto nel modo più affidabile possibile.
Le conferme del livello applicazione non sono un'opzione (il protocollo è HTTP e sto scrivendo un piccolo server).
Dipende dall'implementazione, ma in generale, sì, un 'close()' svuota tutti i dati rimanenti nel buffer prima che faccia effettivamente a pezzi il socket. Il chilometraggio può variare se si termina l'intero processo oltre a chiamare 'close()'. – aroth
@aroth Il chilometraggio * non * varia se si esce dal processo. Non c'è differenza tra i due casi. Se si desidera mantenere il contrario, fornire un riferimento autorevole. – EJP
@EJP - Un riferimento autorevole su cosa * potrebbe * accadere in programmi arbitrari? Non penso che esista una cosa del genere. Ma è abbastanza semplice dare un esempio plausibile. Supponiamo che tu abbia un programma che delega tutte le operazioni di rete in un thread separato, come dovrebbe fare la maggior parte dei programmi. È possibile che il thread principale termini il processo (con garbo o meno) mentre il thread in background sta chiamando 'close()'. La chiamata riuscirà in tal caso? Ne dubito. Certo, quello che dici dovrebbe essere vero per qualsiasi programma a thread singolo. Ma non tutti i programmi sono a thread singolo. – aroth