Ho un problema nel capire cosa recv()/recvfrom() restituisce da un socket UDP non-blockig.programmazione del socket udp non bloccante in C: cosa ottengo?
Un po 'più specifico e rispetto al protocollo TCP (per favore correggetemi se sbaglio):
Un socket di blocco (TCP o UDP) non sarà tornare da un recv() fino a quando non sono alcuni dati nel buffer. Questo potrebbe essere un numero di byte (TCP) o un datagramma completo (UDP).
Un socket TCP non bloccante restituisce EWOULDBLOCK (linux)/WSAEWOULDBLOCK (Windows) oi byte attualmente presenti nel buffer. Dato che i dati TCP sono uno stream, non importa quanti byte vengono restituiti.
Ora la domanda:
- un socket UDP non bloccante restituisce anche WOULDBLOCK (linux)/WSAEWOULDBLOCK (Windows) Se non ci sono dati disponibili. Ma se ci sono dati disponibili, un socket UDP non bloccante restituisce solo alcuni byte, il che significa che si ottiene solo metà di un datagramma O un socket UDP restituisce sempre datagrammi completi ??
Edit:
Quello che voglio dire con "la metà di un datagram" è: cosa succede se io chiamo recv() in un solo momento in cui la presa sta ricevendo un datagramma. In quel momento ci sono alcuni byte nel buffer ma il datagramma non è ancora completo.
Le vostre spiegazioni e commenti sono apprezzati. Grazie!
Sembra che sia possibile passare e ricevere un flag MSG_TRUNC su 'recvmsg' in Linux. Documentato nella manpage 'recv (2)'. In un'altra nota, forse sto fraintendendo, ma posso trovare solo il comportamento di scartare documentato nella manpage per 'socket (2)', che lo menziona solo per i socket 'SOCK_SEQPACKET'. Non li ho mai usati personalmente. –
'MSG_TRUNC' come argomento per' recv (2) 'non è standard. Non è disponibile su FreeBSD o Mac OS X (i sistemi a cui ho accesso al momento, probabilmente vero per gli altri). 'MSG_TRUNC' è disponibile su Linux, FreeBSD e Mac OS X nel membro' flags' di 'struct msghdr' passato a' recvmsg (2) '. In ogni caso, il datagramma verrà troncato se il buffer passato non è abbastanza grande, anche con 'recv (2)' su Linux. Il chiamante deve controllare il valore di ritorno e confrontarlo con le dimensioni del buffer se viene utilizzato 'MSG_TRUNC'. Saprà che i dati sono persi, ma è ancora perso. –
Grazie! Ciò significa che UDP è ** veramente ** orientato ai pacchetti ... – Uwe