Domanda

Sto usando il linguaggio C che è una piattaforma comune sia per il server che per il client.

Ho una struttura di un tipo particolare che voglio inviare al client dal server.

Ad esempio

CODICE SERVER

 //necessary declarations

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

CODICE CLIENTE

struct hostent *hp;

msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);

Quindi, sostanzialmente, voglio inviare una struttura dal server al client. Ma dai pezzi di codice di cui sopra ottengo errori di segmentazione e non sono sicuro che tale trasferimento di strutture sia fattibile. C'è qualche via d'uscita?

È stato utile?

Soluzione

Per prima cosa devi malloc () per allocare memoria per la struttura hostent. È possibile trasferire una struttura tramite sendto () / recvfrom () ma poiché struct hostent contiene puntatori, i membri di questa struttura che sono puntatori non hanno significato non appena vengono trasferiti all'altra estremità.

Altri suggerimenti

Rimuoverei & amp; di fronte a hp

In generale, si desidera evitare il trasferimento di strutture non elaborate su reti a meno che non siano state progettate specificatamente per l'uso come trasporto di rete o a meno che non si sia assolutamente sicuri che entrambe le estremità avranno sempre esattamente la stessa architettura. Le differenze nell'imbottitura e nell'ordine dei byte possono far apparire confusi i dati all'altra estremità. Il particolare tipo di struttura che stai tentando di trasferire non funzionerà perché viene inviato grezzo (vedi la risposta di Petros)

Il problema nel tuo codice di invio è che hp è un puntatore e lo stai trattando come se fosse i dati a cui punta. sizeof (hp) restituisce la dimensione di un puntatore, non la dimensione della struttura hostent puntata. Inoltre, stai creando un puntatore a puntatore nel secondo argomento di sendto quando non intendi farlo. Il codice di invio dovrebbe essere:

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

Hai anche un problema con il codice di ricezione. Dovresti allocare spazio per recvfrom per memorizzare i dati ricevuti. Non lo alloca per te. Cambia il tuo codice di ricezione in uno di questi due:

// Store on the stack
struct hostent h;

msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);

o

// 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);

Se hp è un puntatore, perché stai prendendo il suo indirizzo?

Dovresti correggere il codice come mostrato di seguito:

struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));


struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);

Sarebbe sempre utile leggere la documentazione sulle funzioni socket.

A proposito, se considero la domanda molto generica nel tuo post, ovvero "desidero inviare una struttura dal server al client", ti consiglio di guardare il seguente post su SO:

Passaggio di una struttura tramite socket in C

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top