Frage

Ich bin mit Sprache C , das ist eine gemeinsame Plattform sowohl für den Server und den Client.

Ich habe eine Struktur eines bestimmten Typs, die ich an den Client vom Server gesendet werden soll.

Für z.

Server-Code

 //necessary declarations

struct hostent *hp;

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

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

Client-Code

struct hostent *hp;

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

Also, im Grunde möchte ich eine Struktur vom Server an den Client senden. Aber aus den oben genannten Teile des Codes Ich erhalte Segmentierungsfehler, und ich bin mir nicht sicher, ob eine solche Strukturübertragung möglich ist. Gibt es einen Ausweg?

War es hilfreich?

Lösung

Als erstes müssen Sie malloc (), um Speicher für die Struktur hostent zuzuordnen. Sie können eine Struktur durch sendto übertragen () / Recvfrom (), aber da struct hostent enthält Zeiger, die Mitglieder dieser Struktur, die Zeiger sind, haben keine Bedeutung, sobald sie an das andere Ende übertragen werden.

Andere Tipps

Ich würde entfernen Sie die & vor hp

In der Regel wollen Sie vermeiden Rohbauten über Netzwerke übertragen, wenn sie speziell für den Einsatz als Netzwerk-Transport entwickelt worden sind, oder es sei denn, Sie sind absolut sicher, dass beide Enden immer genau die gleiche Architektur sein wird. Unterschiede in der Polsterung und Bytereihenfolge können bewirken, dass die Daten am anderen Ende verstümmelt erscheinen. Die besondere Art der Struktur Sie versuchen (siehe die Antwort von Petros)

roh zu übertragen funktioniert einfach nicht gesendet werden

Das Problem in Ihrem Sende Code ist, dass hp ein Zeiger ist und Sie behandeln es wie es die Daten ist es zu den Punkten. sizeof (hp) gibt die Größe eines Zeigers, nicht die Größe des spitzen-to hostent Struct. Außerdem erstellen Sie einen Zeiger auf Zeiger im zweiten Argument von sendto, wenn Sie nicht bedeuten, zu. Der sendende Code sollte lauten:

struct hostent *hp;

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

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

Sie haben auch ein Problem in dem Code. Sie sollen die Daten zuordnen Platz für Recvfrom speichern sie empfangen. Es spielt zuteilen es nicht für Sie. Ändern Sie Ihre Empfangscode zu einer dieser beiden:

// Store on the stack
struct hostent h;

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

oder

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

Wenn hp ist ein Zeiger, warum nehmen Sie seine Adresse?

Sie sollten den Code korrigieren, wie unten dargestellt:

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

Es würde immer helfen, die Dokumentation auf Socket-Funktionen zu lesen.

Übrigens, wenn ich die sehr allgemeine Frage in Ihrem Beitrag betrachten, das heißt: „Ich möchte eine Struktur vom Server an den Client senden“, würde ich empfehlen, im folgenden Beitrag der Suche auf SO:

eine Struktur über Sockets in C Passing

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top