2017-05-10 2 views
1

Nur ein Python-Programm, das als Server für Unix-Sockets fungiert und wenn es eine Verbindung erhält, liest 4 Bytes davon.Unix-Sockets zwischen C und Python

Auf der anderen Seite habe ich ein C-Programm, das mit dem Server verbindet und sendet diese 4 Bytes an es.

file.py

packet = connection.recv(4, socket.MSG_WAITALL) 
for value in packet: 
    if value == '\0': 
     print 'A none' 
    else: 
     print value 

file.c

size_t toSend 84; // Char representation \0\0\0T 
write(fd, (void *)&toSend, sizeof(toSend)); 

Dies macht das Python-Programm erhalten eine falsche Reihenfolge von Bytes. Hier ist der Ausgang

T 
A none 
A none 
A none 

Das erste, was mir in den Sinn kam, war, dass dies das Ergebnis von Endian, aber dann geändert ich die Dateien sie so zu verlassen.

file.c

char abc[16]; 
// setting char abc to be 'ABCDEFGHIJKLMNOP' (without ending \0) 
write(fd, (void *)&abc[0], 16); 

file.py

packet = connection.recv(16, socket.MSG_WAITALL) 
// everything else, wasn't modified 

Und das gedruckt:

A 
B 
C 
... 
P 

Dieses Mal das sie empfangen wurde, wie es sollte. Könnte mich jemand darauf hinweisen, was ich falsch mache? Wenn es nichts mit dem Typ size_t zu tun hat, kann ich an nichts anderes denken.

Danke!

+0

Endianness ist nicht relevant für 'char's, und ich schlage vor, feste Größe zu verwenden, zB:' uint32_t' anstelle von 'size_t' –

Antwort

2

Das hat eigentlich nichts mit Python zu tun und nichts mit Sockets zu tun, aber du hast Recht, es hat mit Endianness zu tun.

Testen Sie die implizite Annahme: Ist 84 wirklich als 0x00 0x00 0x 00 0x54 auf Ihrem Computer dargestellt, der das C-Client-Programm ausführt? Versuchen Sie, in eine Datei anstelle eines Sockets zu schreiben, und bearbeiten Sie das Ergebnis binär. Ich wette, Sie werden sehen, dass Ihre native Architektur Little-Endian ist und dass die Daten, die geschrieben wurden, 0x54 0x00 0x00 0x00 waren.

Was Sie auf dem Socket sehen, ist einfach das, was Sie senden.

+0

Hinweis, typische Windows PCs sind Little-Endian, also wenn Sie auf Windows laufen, können Sie ziemlich sicher sein, dass Ihre Daten Little-Endian gespeichert sind. –

+1

Ich benutze eine Raspberry Pi W und Sie haben Recht, es wird als '0x54000000' dargestellt. Vielen Dank! – lpares12

+0

Da PC ist Little Endian (0x54000000) und Pi ist Little Endian, sollte Pi nicht das gleiche wie PC sein? – KevinDTimm

2

Dies ist genau Endianness. Die Bits eines einzelnen Bytes sind immer in der gleichen Reihenfolge, aber die Byte-Reihenfolgen innerhalb eines Wortes können sich unterscheiden. Und zuerst senden Sie ein Wort, bestehend aus 4 Bytes, und sie werden in umgekehrter Reihenfolge (d. H. Big-Endian) empfangen, aber im zweiten Beispiel senden Sie Ihre Nachricht byteweise.

+0

' s/entgegengesetzte Reihenfolge/big endian order/' – KevinDTimm

Verwandte Themen