Обмен данными через сокеты домена unix между сервером, написанным на C, и клиентом, написанным на python

Я пытаюсь отправить / получить данные через сокет домена unix между сервером, написанным на C, и клиентом, написанным на Python. Когда я пытаюсь распаковать полученные данные, я получаю эту ошибку.

struct.error: размер unpack str не соответствует формату

client = socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
client.connect("/tmp/udfile")
Msg = struct.pack('I I 64s I 64s I 2048s', 1, 2, "SAMPLE1", 0, "SAMPLE2", 0, "SAMPLE3")
client.sendall(Msg)
Reply = client.recv(2192)
opcode, atype, btype, ctype, dtype, ftype, etype = struct.unpack('I I 64s I 64s I 2048s', Reply)

Хотел бы знать, возможно ли это вообще. Если да, то что мне не хватает.


person Vijay    schedule 04.02.2014    source источник
comment
Где произошла ошибка? Какие данные были получены? Вы пробовали отладку с использованием pdb и pdb.set_trace()?   -  person hochl    schedule 04.02.2014
comment
Спасибо. Я никогда не знал об этом модуле pdb. Использовал это и смог отладить проблему. было несоответствие по размеру.   -  person Vijay    schedule 21.03.2014


Ответы (1)


Подсказка здесь SOCK_STREAM. Стрим. У вас есть поток подключения к другой программе. Границы сообщений не гарантируются. Вы преодолели первое препятствие - вы использовали sendall вместо send. Однако вы не прошли второй этап. recv(N) не гарантирует возврат N байтов. Он вернет до N байт. Поскольку для успешного выполнения struct.unpack вам нужно ровно 2192 байта, вам нужно вызвать recv в цикле и накапливать результаты в буфере, пока вы не накопите 2192 байта. Тогда вы можете позвонить struct.unpack.

person Jean-Paul Calderone    schedule 07.02.2014