Efekt nastavení SO_SNDBUF
Tato možnost se liší pro TCP a UDP.
- Pro UDP to nastavuje limit velikosti datagramu , tj. cokoli většího bude vyřazeno.
- Pro TCP to pouze nastavuje velikost vnitřní vyrovnávací paměti pro daný soket (s určitým zaokrouhlením na hranici stránky as horním limitem).
Protože to vypadá, že mluvíte o TCP, účinek, který pozorujete, je vysvětlen tím, že soket je v režimu blokování , takže send(2)
blokuje, dokud jádro nepřijme všechna vaše data, a/nebo síťový zásobník asynchronně odřadí data z fronty a přenese je na síťovou kartu, čímž uvolní místo ve vyrovnávací paměti.
TCP je také protokol proudu , nezachovává žádnou strukturu „zprávy“. Jeden send(2)
může odpovídat více recv(2)
s na druhé straně a naopak. Považujte to za byte-stream.
SO_SNDBUF
konfiguruje vyrovnávací paměť, kterou implementace soketu interně používá. Pokud váš soket neblokuje, můžete odesílat pouze do nakonfigurované velikosti, pokud váš soket blokuje, není pro vaše volání žádné omezení.