L'effetto dell'impostazione SO_SNDBUF
l'opzione è diversa per TCP e UDP.
- Per UDP questo imposta il limite sulla dimensione del datagramma , ovvero qualsiasi cosa più grande verrà scartata.
- Per TCP questo imposta semplicemente la dimensione del buffer interno al kernel per un dato socket (con qualche arrotondamento al limite della pagina e con un limite superiore).
Dal momento che sembra che tu stia parlando di TCP, l'effetto che stai osservando è spiegato dal fatto che il socket è in modalità di blocco , quindi send(2)
blocca finché il kernel non può accettare tutti i tuoi dati e/o lo stack di rete rimuove in modo asincrono i dati dalla coda e li invia alla scheda di rete, liberando così spazio nel buffer.
Inoltre, TCP è un protocollo di flusso , non conserva alcuna struttura di "messaggio". Un send(2)
può corrispondere a più recv(2)
s dall'altra parte e viceversa. Trattalo come flusso di byte.
SO_SNDBUF
configura il buffer che l'implementazione del socket utilizza internamente. Se il tuo socket non è bloccante puoi inviare solo fino alla dimensione configurata, se il tuo socket è bloccante non ci sono limiti per la tua chiamata.