2011-12-26 16 views
9

Bene, la mia domanda potrebbe sembrare una cosa di base, ma sono nuovo sul lato della programmazione di rete. Vorrei sapere:È sempre necessario il binding di una presa?

1) È sempre necessario associare un socket per ricevere messaggi da questo? Ho visto uno sniffer code (raw socket) uno in cui direttamente sta invocando recvfrom e un altro pezzo di codice in cui sta invocando bind e quindi una ricezione.

2) Qual è la differenza tra la famiglia AF_ * e PF_ *? La versione successiva è correlata a POSIX? Qual è l'opzione consigliata?

+0

1) No, il binding per la ricezione UDP è facoltativo. –

+0

http://stackoverflow.com/questions/2549461/what-is-the-difference-between-af-inet-and-pf-inet-constants. IIRC, P sta per protocollo (famiglia) mentre A sta per Indirizzo. – Aif

+0

@Kerrek SB: Ma il codice dello sniffer che sto riferendo cattura anche i pacchetti da altri protocolli, ma ancora non è stato invocato 'bind' – kingsmasher1

risposta

8

No, non è necessario eseguire il binding().

Se si utilizza un socket TCP o UDP in cui si prevede di connettere() o inviare un pacchetto a una destinazione con sendto(), il kernel associa automaticamente il socket a un numero di porta appropriato quando si prova connettersi o inviare. Questo è generalmente il modo preferito. bind() i socket client sono considerati dannosi.

Lo stesso vale anche per i socket AF_UNIX: il lato client non ha bisogno di eseguire il binding e non dovrebbe farlo normalmente.

+0

Quindi non sei d'accordo con KerrekSB dove dice che è solo per ricevere pacchetti. Destra? Anche la connessione non è richiesta, come puoi vedere dai link sopra. Solo una chiamata a 'socket' seguita da' recvfrom' – kingsmasher1

+0

Stavo parlando di socket TCP o UDP. Quello che succede nei socket grezzi non è veramente rilevante. – MarkR

+0

Puoi spiegare perché i socket client vincolanti sono considerati dannosi? – Pacerier

0

Non so Linux, ma su Windows, se recvfrom() viene chiamato su un socket non associato, avrà esito negativo con un errore WSAEINVAL.

+0

Non penso sia utile provare a ricevere pacchetti su un socket UDP che non è associato a una porta specifica, a meno che non ne abbia già inviato qualcuno. È possibile associare un socket a una porta "Do not Care", quindi trovare la porta con getsockname. Ad esempio, se volessi utilizzare UDP per ricevere pacchetti da un server, ma usare TCP per inviare comandi (allo stesso tempo) - ad esempio, in alcune situazioni di streaming in cui ricevo sempre solo in UDP, non invio mai.Dovrei associare alla porta 0 (non importa) e quindi passare il numero di porta sul mio protocollo (TCP) al server. – MarkR

Problemi correlati