Premetto che, come prima, anche qui tutti i cast sono inutili, dato che tutte le espressioni a cui sono applicati sono già del tipo giusto (memcpy accetta dei void * come primi argomenti, a cui può decadere qualunque puntatore senza cast). Dunque la possiamo riscrivere come:
codice:
memcpy(&info.sin_addr, h->h_addr_list[0], 4);
Andiamo con ordine; la memcpy è una funzione che copia nella destinazione specificata dal primo argomento il numero di byte specificati nell'ultimo argomento. La zona da cui i byte da copiare sono presi è specificata come secondo argomento.

info è un sockaddr_in, che rappresenta un endpoint del socket; il suo membro sin_addr rappresenta l'indirizzo IP, ed è una union che di fatto espone in tre maniere diverse (come 4 byte, come 2 valori da 16 bit o come un singolo valore a 32 bit) gli stessi 4 byte di memoria. In ogni caso, &info.sin_addr equivale a prendere l'indirizzo di memoria a cui viene memorizzato l'indirizzo. Tale locazione di memoria viene usata come destinazione della copia.

h rappresenta un host; h_addr_list è un array di char * che contiene i vari indirizzi associati all'host in questione. h->h_addr_list[0] si riferisce dunque al primo degli indirizzi associati all'host. Di fatto nella memoria puntata da h->h_addr_list[0] si trovano semplicemente 4 byte che rappresentano l'indirizzo (assumendo di star parlando di IPv4). Tali 4 byte dunque sono quelli che vengono copiati da memcpy.

Per farla breve: la riga in questione copia l'indirizzo dell'host rappresentato da h nel campo dell'indirizzo della variabile info.