Quando si utilizza un socket TCP, ciò faComportamento di arresto (calzino, SHUT_RD) con TCP
shutdown(sock, SHUT_RD);
effettivamente fare? Fa semplicemente restituire un codice di errore a tutte le chiamate recv()
? Se sì, quale codice di errore?
Fa sì che i pacchetti vengano inviati dalla connessione TCP sottostante? Ciò che accade a tutti i dati che l'altro lato invia a questo punto - è mantenuto, e la dimensione della finestra della connessione continua a ridursi fino a quando non arriva a 0, o viene semplicemente scartata e la dimensione della finestra non si riduce?
perché SHUT_RD influisce sugli autori? Non vedo alcuna ragione ovvia per farlo (anche se, suppongo che io usi sempre MSG_NOSIGNAL, in modo che possa avere un impatto). – Tom
Perché (citando da Wikipedia) "Sulle piattaforme conformi a POSIX, SIGPIPE è il segnale inviato a un processo quando tenta di scrivere su una pipe senza un processo collegato all'altro capo." E l'istruzione shutdown (calzino, SHUT_RD) disconnette il processo del lettore dalla pipe. Per aggiungere lesioni a insulti, l'azione predefinita al ricevimento di un segnale SIGPIPE è per il processo (cioè lo scrittore) di terminare. –
Questo non è corretto. Qualsiasi ulteriore lettura causerà recv() per rieseguire lo zero, indicando la fine del flusso. – EJP