2014-03-21 4 views
0

Я пытаюсь отправить буфер через сокет домена unix в приложение, получить ту же структуру назад с обновленными значениями, а затем отправить этот буфер обратно в это приложение. Я могу отправить недавно упакованные данные и получить ответ обратно, но если я попытаюсь упаковать полученный буфер и отправить его снова через сокет, я столкнулся с ошибками, говоря, что существует несоответствие в размере, который отправляется в приложение который прослушивает сокет и закрывает сокет.python struct module (python 2.4)

Следующий снип - это то, чего я пытаюсь достичь. Похоже, что преобразование endianess/string, которое я в зависимости от отправки данных назад, неверно.

""" request struct 
#structure i am sending over unix domain socket 
struct prod_entry { 
    unsigned int  Model; 
    unsigned int  year; 
    char     prodname[64]; 
    } 
""" 


value = (1, 1992, "mustang") 

Что я здесь делаю неправильно. Я хочу получить буферный пакет и отправить его снова.

prod_entry = struct.pack('I I 64s', *value) 


def update(update_records): 
    try: 
     comm_sock = socket.socket(socket.AF_UNIX,socket.SOCK_STREAM) 
    except socket.error: 
     return 


    try: 
     comm_sock.connect(PROD_UNIX_DOMAIN_SKT) 
    except socket.gaierror: 
     return 

    try: 
     comm_sock.sendall(update_records) 
    except socket.error: 
     return 

    reply = comm_sock.recv(struct.calcsize('I I 64s ')) 
    out1 = struct.unpack('<I I 64s',reply) 

    rebound = struct.pack('I I 64s', *out1) 
    comm_sock.sendall(rebound) 

    reply2 = comm_sock.recv(struct.calcsize('I I 64s ')) 
    out2 = struct.unpack('<I I 64s',reply2) 

    comm_sock.close() 

update(prod_entry) 

Я получаю :: struct.error: распаковывать размер ул не соответствует формату

ответ

0

recvbufsize аргумент указывает только максимальный размер. recv может возвращать меньший кусок, чем максимальный указанный размер. Вам нужно зациклиться на recv, если он не возвращает полную упакованную строку.

Вы быстро обнаружите, что вам нужен протокол для любого сетевого общения, подобного этому. Возможно, вам будет полезно ознакомиться с (например,) протоколом HTTP, особенно. request methods.

+0

Да, вы правы, для recv мы указываем максимальный размер буфера, и он не равен тому, что я пытаюсь распаковать, и, следовательно, я получил эту ошибку. Я нашел это, напечатав размер буфера, возвращаемого recv, и соответствующим образом скорректировал формат моей распаковки. благодаря – Vijay