3 Stimmen

Senden des Arrays beliebiger Länge über einen Socket. Endianness

Ich kämpfe gerade mit der Socket-Programmierung und bin auf ein Problem gestoßen, von dem ich nicht weiß, wie ich es portabel lösen kann. Die Aufgabe ist einfach: Ich muss das Array von 16 Bytes über das Netzwerk senden, es in einer Client-Anwendung empfangen und es parsen. Ich weiß, es gibt Funktionen wie htonl, htons und so weiter, die mit uint16 und uint32 verwendet werden können. Aber was soll ich mit den Datenpaketen machen, die größer als das sind?

Gracias.

3voto

ceo Punkte 1128

Endianness ist eine Eigenschaft von Multibyte-Variablen wie 16-Bit- und 32-Bit-Ganzzahlen. Sie hat damit zu tun, ob das höherwertige oder das niederwertige Byte zuerst kommt. Wenn die Client-Anwendung das Array als einzelne Bytes verarbeitet, muss sie sich nicht um die Endianness kümmern, da die Reihenfolge der Bits innerhalb der Bytes die gleiche ist.

3voto

pm100 Punkte 40532

Sie sagen, ein Array von 16 Bytes. Das hilft nicht wirklich weiter. Die Endianness spielt nur bei Dingen eine Rolle, die größer als ein Byte sind.

Wenn es wirklich rohe Bytes sind, dann senden Sie sie einfach, Sie werden sie genauso erhalten.

Wenn es wirklich eine Struktur ist, die Sie senden möchten

 struct msg
 {
     int foo;
     int bar;
 .....

Dann müssen Sie sich durch den Puffer arbeiten, um die gewünschten Werte zu erhalten.

Wenn Sie senden, müssen Sie ein Paket zu einem Standardauftrag zusammenstellen

 int off = 0;
 *(int*)&buff[off] = htonl(foo);
 off += sizeof(int);
 *(int*)&buff[off] = htonl(bar);
 ...

wenn Sie erhalten

 int foo = ntohl((int)buff[off]);
 off += sizeof(int);
 int bar = ntohl((int)buff[off]);
 ....

EDIT: Wie ich sehe, wollen Sie eine IPv6-Adresse senden, die immer in Netzwerk-Byte-Reihenfolge ist - Sie können sie also einfach roh streamen.

1voto

Jerry Coffin Punkte 452852

htons , htonl usw., sind für den Umgang mit einem einzelnen Datenelement (z. B. einem int), das größer als ein Byte ist. Ein Array von Bytes, bei dem jedes einzelne als einzelnes Datenelement verwendet wird (z. B. eine Zeichenkette), muss überhaupt nicht zwischen Host- und Netzwerk-Byte-Reihenfolge übersetzt werden.

1voto

Andrew O'Reilly Punkte 1625

Die Bytes selbst haben keine Endianness mehr, da jedes einzelne Byte, das von einem Computer übertragen wird, auf einem anderen empfangenden Computer den gleichen Wert hat. Endianness ist heutzutage nur noch für Multibyte-Datentypen wie Ints von Bedeutung.

In Ihrem speziellen Fall kommt es darauf an, zu wissen, was der Empfänger mit den 16 Bytes machen wird. Wenn er jeden der 16 Einträge im Array als diskrete Ein-Byte-Werte behandelt, können Sie sie einfach senden, ohne sich um Endiannes zu kümmern. Wenn der Empfänger das 16-Byte-Array hingegen als vier 32-Bit-Ganzzahlen behandelt, müssen Sie jede Ganzzahl vor dem Senden durch hton() laufen lassen.

Ist das hilfreich?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X