2014-02-04 4 views
0

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

struct.error: unpack str size does not match format

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) 

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

+0

Где произошла ошибка? Какие данные были получены? Вы пробовали отладку с помощью 'pdb' и' pdb.set_trace() '? – hochl

+0

Спасибо. Я никогда не знал об этом модуле pdb. Использовал это и смог отладить проблему. было несоответствие в размерах. – Vijay

ответ

0

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