Как правило, вы хотите избежать передачи необработанных структур по сетям, если они специально не предназначены для использования в качестве сетевого транспорта или если вы не абсолютно уверены, что оба конца всегда будут иметь одинаковую архитектуру. Различия в заполнении и порядке байтов могут привести к искажению данных на другом конце. Конкретный тип структуры, которую вы пытаетесь перенести, просто не будет работать в исходном виде (см. Ответ Петроса)
Проблема в вашем коде отправки состоит в том, что hp является указателем, и вы рассматриваете его так, как будто это данные, на которые он указывает. sizeof (hp) возвращает размер указателя, а не размер структуры, на которую указывает указатель. Кроме того, вы создаете указатель на указатель во втором аргументе sendto, когда не хотите этого делать. Код отправления должен гласить:
struct hostent *hp;
hp=gethostbyname("www.google.com");
sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
У вас также есть проблема в коде получения. Вы должны выделить место для recvfrom для хранения полученных данных. Он не выделяет его для вас. Измените свой код получения на один из этих двух:
// Store on the stack
struct hostent h;
msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);
или
// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));
msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);