2009-12-23 14 views
15

Quando è richiesto IPPROTO_UDP?quando è richiesto IPPROTO_UDP?

C'è mai stato un caso in cui UDP è non il protocollo predefinito per SOCK_DGRAM? (Casi reali, non ipotetiche "Potrebbe essere", per favore ")

cioè, quali sono le situazioni in cui le due righe sarebbero non produrre un comportamento identico

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1) 

risposta

12

Attribuite queste dichiarazioni:?

tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 
udp_socket = socket(AF_INET, SOCK_DGRAM, 0); 
raw_socket = socket(AF_INET, SOCK_RAW, protocol); 

la ip(7) pagina di manuale in linux dice:

Gli unici valori validi per il protocollo sono 0 e IPPROTO_TCP per socket TCP e 0 e IPPROTO_UDP per socket UDP. Per SOCK_RAW è possibile specificare un protocollo IP IANA definito nei numeri assegnati RFC 1700 .

Queste due righe nelle tue domande produrranno sempre lo stesso risultato.

+0

Penso che l'uso di 'IPPROTO_UDP' di zero non sia lo stesso risultato di un socket che richiede di riempire tutte le intestazioni. – WilliamKF

14

Alcuni sistemi operativi (ad esempio kernel Linux dopo 2.6.20) supportano un secondo protocollo per SOCK_DGRAM, denominato UDP-Lite. Se supportato dal tuo sistema, sarebbe abilitato fornendo IPPROTO_UDPLITE come terzo argomento alla chiamata socket().

Si differenzia dal normale UDP consentendo il checksum da applicare solo a una porzione del datagramma. (Normalmente, il checksum UDP è uno sforzo tutto o niente.) In questo modo, il protocollo può essere più resistente ai guasti del checksum dovuti alla trasmissione frammentata, nel caso in cui alcuni frammenti al di fuori dell'area di checksum siano andati perduti durante il trasporto. Finché i frammenti che coprono la parte di checksum sono stati ricevuti con successo, tanto più datagramma possibile sarà ancora consegnato all'applicazione.

Per la retrocompatibilità con il codice esistente, sospetto (ma non posso garantire) che il socket di chiamata (AF_INET, SOCK_DGRAM, 0) continui di default al normale UDP, anche nei sistemi che supportano ulteriormente UDP-Lite.

Problemi correlati