Frage

Ich habe einen client und server-Programm, wo ich möchten senden Sie eine gesamte Struktur vom client aus und geben dann die struct-member "- ID" auf dem server.

Ich habe all das getan, verbinden etc.-und es bereits geschafft, senden Sie eine Schnur durch:

send(socket, string, string_size, 0);

So ist es möglich zu senden eine Struktur anstelle einer Zeichenfolge, durch send()?Kann ich ersetzen Sie einfach mein Puffer auf dem server, um eine leere Struktur des gleichen Typs und gehen?

War es hilfreich?

Lösung

Welll...senden von Strukturen, die durch das Netzwerk ist irgendwie schwer, wenn Sie es tun richtig.

Carl ist richtig - Sie können senden Sie eine Struktur, die durch ein Netzwerk mit den Worten:

send(socket, (char*)my_struct, sizeof(my_struct), 0);

Aber hier ist die Sache:

  • sizeof(my_struct)) ändern kann, die zwischen dem client und dem server.Compiler oft eine gewisse Menge an Polsterung und Ausrichtung, sodass es sei denn, Sie definieren die Ausrichtung explizit (vielleicht mit einem #pragma pack ()),, die Größe kann unterschiedlich sein.
  • Das andere problem ist tendenziell byte-Reihenfolge.Einige Maschinen sind big-endian und andere sind little-endian, so dass die Anordnung der bytes, die könnte anders sein.In der Realität, es sei denn, Ihr server oder-client ausgeführt wird, auf nicht-Intel-hardware (was vermutlich nicht der Fall), dann ist dieses problem besteht eher in der Theorie als in der Praxis.

So die Lösung die Menschen oft vorschlagen, ist, eine routine, die serialisiert die Struktur.Das heißt, es sendet die Struktur einer Daten-member zu einer Zeit, sicherstellen, dass der client und der server nur die send() und recv() die genauen angegebene Anzahl von bytes, die Sie code in Ihrem Programm.

Andere Tipps

Sind die client-und server-Maschinen "der gleiche"?Was Sie vorschlagen, wird nur funktionieren, wenn der C-Compiler an jedem Ende lag der Struktur im Speicher ist genau das gleiche.Es gibt viele Gründe, warum dies möglicherweise nicht der Fall.Zum Beispiel werden die client-und server-macines können unterschiedliche Architekturen, dann die Darstellung von zahlen im Speicher (big endian, little-endian) unterscheiden könnten.Auch wenn die Kunden Maschinen-und server-Rechner, auf der gleichen Architektur zwei verschiedene C-Compiler können unterschiedliche Richtlinien dafür, wie Sie das Layout structs im Speicher (zB.der Abstand zwischen den Feldern zu richten ints auf Wort-Grenzen).Auch die gleichen conmpiler mit verschiedenen Flaggen geben könnten unterschiedliche Ergebnisse.

Pragmatisch, ich vermute, dass Ihr client und server die gleiche Art von Maschine und so was Sie vorschlagen, funktionieren wird, aber Sie müssen sich bewusst sein, dass als Allgemeine Regel ist es nicht und das ist, warum standards wie CORBA erfunden wurden, oder warum die Leute benutzen einige Allgemeine Darstellung, wie XML.

Sie können, wenn der client und der server müssen legte die Struktur genau die gleiche Weise, was bedeutet, dass die Felder sind alle die gleiche Größe haben, mit der gleichen Polsterung.Zum Beispiel, wenn Sie eine long in Ihrer Struktur können 32-bit auf einem Rechner und 64-bit auf der anderen, in dem Fall die struct wird nicht korrekt empfangen.

In deinem Fall, wenn der client und der server wird immer auf sehr ähnliche C-Implementierungen (zum Beispiel, ob dies nur ein code die Sie verwenden, um zu lernen, einige grundlegende Konzepte, oder wenn für andere Grund, Sie wissen, dass Ihr code wird nur einmal ausgeführt, die auf Ihrer aktuellen version von OSX), dann können Sie wahrscheinlich Weg mit ihm.Denken Sie daran, dass Ihr code wird nicht unbedingt ordnungsgemäß funktionieren auf anderen Plattformen, und es gibt noch mehr zu tun, bevor es ' s geeignet für den Einsatz in den meisten realen Situationen.

Für die meisten client-server-Anwendungen, bedeutet dies, dass die Antwort ist, können Sie es nicht im Allgemeinen.Was Sie wirklich tun ist, definieren Sie die Mitteilung in Bezug auf die Anzahl der bytes, die gesendet werden, was zu bestellen, was Sie bedeuten, und so auf.Dann an jedem Ende, Sie tun etwas, das Plattform-spezifische, um sicherzustellen, dass die Struktur, die Sie verwenden hat genau das gewünschte layout.Auch so, vielleicht tun müssen einige byte-swapping, wenn Sie senden integer Mitglieder der struct little-endian-Format, und dann wollen Sie Ihren code zur Ausführung auf einer big-endian-Maschine.Datenaustausch-Formate wie XML, json und Googles protocol buffers vorhanden sind, so dass Sie nicht müssen dies tun, fummelig Zeug.

[Bearbeiten:denken Sie auch daran ist natürlich, dass einige struct Mitglieder nie über die Leitung gesendet.Für Beispiel, wenn Ihre Struktur hat einen Zeiger in es, dann die Adresse verweist auf Speicher auf der sendenden Maschine und nutzlos ist auf dem empfangenden Ende.Entschuldigung, wenn dies bereits für Sie offensichtlich, aber es ist sicherlich nicht für jeden offensichtlich ist, wenn Sie gerade erst mit C -].

Sie können, aber Sie müssen sich bewusst sein, 2 wichtige Dinge.

  1. Die Programme auf beiden enden haben werden ABI kompatibel.Sie sind in der Regel, wenn beide enden auf dem gleichen Prozessor-Architektur, Gleiches OS, zusammengestellt mit dem gleichen compiler und compiler-flags.
  2. TCP ist ein stream.Sie haben zu machen sicher, Sie senden die ganze Struktur.Schauen Sie in die Dokumentation für die send () - Aufruf - es gibt die Anzahl der bytes gesendet - die vielleicht weniger, als Sie sagte es zu.Gleich auf der Empfänger-Seite.Nur weil Sie geschickt die struct mit 1 senden Sie rufen, bedeutet nicht, Sie erhalten es mit 1 recv-Aufruf.Es machen nehmen mehrere recv-Aufruf, um alle Stücke.

Yep, Strukturen vom gleichen Typ sind alle in der gleichen Größe.Wenn Sie den Mauszeiger casting-Recht du bist gut zu gehen.

Im Allgemeinen ist es eine schlechte Idee, dies zu tun, selbst wenn Ihr client und Ihr server aktivieren aus, um das Layout der Struktur im Speicher die gleiche Weise.

Auch wenn Sie nicht Vorhaben, pass komplexere Datenstrukturen (das würde bedeuten, Zeiger hin und her, ich empfehlen, dass Sie serialisieren Sie Ihre Daten, bevor Sie Sie senden über das Netzwerk.

Senden Sie die Daten als text-Datei und dann entschlüsseln, nachdem Sie es empfangen.Dies ist der beste Weg, wenn Sie möchten, dass Ihre Daten in Ihren verschickt!!

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