2010-07-20 12 views
10

Capisco che la dimensione massima del buffer di default che posso usare con queste funzioni sia 65507 (5535 - intestazione IPv4 - intestazione UDP). Tuttavia, c'è un modo per cambiare questo? Devo essere in grado di inviare un buffer più grande ~ 66000 byte. Ho provato a utilizzare la funzione setsockopt(), ma non sembra funzionare.UDP sendto() e recvfrom() dimensione massima del buffer

Grazie!

+0

Non è possibile dividere il buffer, taggandolo con bit aggiuntivi per conoscere l'ordine? – Scharron

+0

Sembra che dovrò inventare uno schema come questo. –

+1

5535 dovrebbe essere 65535 – kumar

risposta

12

No.

UDP fornisce solo un datagramma come la parte di dati di un pacchetto IP, un pacchetto IP ha una lunghezza di campo a 16 bit limitando così i dati a 2^16 byte comprese le intestazioni o 65507 byte per la parte dati UDP (supponendo che non ci siano opzioni ipv4), non c'è modo di gestire pacchetti più grandi con UDP oltre a suddividerli in più pacchetti e gestire da soli il riassemblaggio, ecc.

+0

Grazie per il chiarimento. –

6

La specifica UDP fornisce 16 bit nell'intestazione UDP per la dimensione del pacchetto, il che significa che non è possibile inviare più di 65k contemporaneamente. Non puoi cambiare questo.

Devi dividere i dati in più pacchetti. Usare TCP invece di UDP renderà la cosa molto più semplice, poiché la completezza e l'ordine di ricezione sono garantiti.

+1

+1 per suggerire TCP invece. – Matt

8

Inoltre è molto probabile che si perdano pacchetti UDP "grandi" lungo il percorso, poiché il pacchetto IP wrapping potrebbe essere frammentato a causa delle limitazioni MTU. Ciascuno dei frammenti potrebbe andare perduto e non vi è alcun meccanismo di recupero in UDP. Quindi, mentre il limite teorico per il carico utile UDP è di ca. 64kB il limite pratico è di circa 1kB.

+4

Questo è un punto importante. Un pacchetto UDP da 65500 byte frammentato in frammenti di dimensioni ethernet trasformerà una percentuale di perdita del frammento sottostante dell'1% in una percentuale di perdita di pacchetti UDP ~ 37%. Grandi pacchetti UDP - non farlo! – caf

+0

Dove lavoro risolviamo questo problema utilizzando le interfacce dedicate su una sottorete privata per il traffico UDP con i pacchetti di grandi dimensioni (e le voci ARP statiche per impedire il rilascio periodico di ARP). Se non puoi farlo, preparati a pacchetti scartati. –

Problemi correlati