2015-12-06 14 views
5

Sto facendo la programmazione di socket in C++ e vedo molte funzioni che prendono i puntatori di struttura e le dimensioni. Ad esempio,Punto di passaggio indirizzo e dimensioni nelle funzioni

struct sockaddr dest; 
//fill dest 
sendto(dgram_socket, secret_message, len, 0, &dest, sizeof dest); 

cosa è il punto di passaggio dimensioni di una struttura di lunghezza fissa (sockaddr) quando la funzione può chiaramente interpretare dal tipo?

+0

Spesso questo modello consente di migliorare in futuro, ad es. un'ipotetica struttura 'sockaddr2' che la funzione può distinguere usando il parametro size. –

+0

@therainmaker - no. Questo non succede –

+0

@Olaf: modifica la tua: questo sembra puro codice C, quindi rimuovere il tag [C++] sembra invece più appropriato per me. –

risposta

4

Perché in realtà sockaddr è solo il tipo di dati segnaposto qui. La struttura dati effettiva che si passa può essere diversa. Ad esempio, le strutture di indirizzi per IPv4 e IPv6 differiscono nel contenuto e nella lunghezza. E questo è il punto di passaggio della dimensione della struttura.

In generale, questa tecnica è ampiamente utilizzata. Una delle due dimensioni viene passata come parametro additioanl o il membro della dimensione è incluso direttamente nella struttura (in genere, come il suo primo membro). Ciò consente alla funzione di ricezione di distinguere tra le diverse versioni conosciute di quella struttura, nelle situazioni, quando le API cambiano nel tempo e vengono aggiunti nuovi membri, ma i programmi ancora compilati con le definizioni API precedenti hanno passaggi passivi con dimensioni effettive inferiori rispetto a nella più recente. Questa è la tipica tecnica affrontata nell'API di Windows: molte strutture native di Windows hanno qualcosa come DWORD cbSize in esse.

+1

Questo è corretto. Potrei aggiungere: long live sockaddr_storage (SOCKADDR_STORAGE in Windows) –

+0

Non sarebbe stato meglio avere una versione int o una versione enumerata? La dimensione sembra essere un cattivo modo per determinare la versione. Cosa succede se strutture simili in due versioni diverse hanno le stesse dimensioni? – Sway

+0

No, questo è nort processo "casuale". Provider API (se si tratta di un normale provider API adequte, questo include grandi aziende come Micrsoft) pubblica alcune versioni consolidate e di qualità garantita. Se il provider API sceglie di utilizzare questo metodo, assicura che non ci saranno tali collisioni e che API può distinguere la versione utilizzando determinate dimensioni di struttura note. Quindi la probabilita 'di questo, nonostante esiste, e' molto bassa, e come se tale difetto fosse affrontato, sara 'rapidamente trovato e risolto. –

2

La struttura sockaddr non è effettivamente fissata in dimensioni - diversi tipi di socket richiedono dimensioni diverse di informazioni sull'indirizzo (ad esempio IPv4 o IPv6).

Quindi in questo caso particolare è effettivamente utile e necessario specificare la lunghezza effettiva di sockaddr che si possiede.

Vedere ad esempio http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/socket.h.html.

Problemi correlati