Декодирование ответа сервера (сокет)

96
17 февраля 2021, 20:20

Задача: есть сокет, через него отправляю запросы и получаю ответы. Изначально он был написан на php, но мне надо переделать его на python. Сокет создан, обмен сообщениями происходит, но я не могу расшифровать ответ сервера. В php функция выглядит так:

function CalcDataSize($fp)
{
        $sz = ''; 
        $packdata = fread($fp,10); 
        $arr = unpack('N',$packdata); 
        $sz = implode("",$arr);     
        return $sz-4;
}
$fp = fsockopen("111.11.1.11", 1111, $errno, $errstr,100); 
if (!$fp)
    echo "$errstr ($errno)<br />\n";
else
{   
    $command = '<command>some command<command>';
    $command = PackData($command,$len); 
    fputs($fp,$command,$len);   
    print fread($fp, CalcDataSize($fp)); 
}

Меня интересует ответ сервера. Итак, он приходит в виде байтовой строки, которая читается на длину CalcDataSize($fp) (высчитывается путем прочтения первых четырех байтов ответа, их распаковки и получения числа sz-4).

Вопрос: как это правильно реализовать на python? Ответ приходит всегда 4 байта, декодировать методом .decode() не получается - ошибка в 3 знаке. Пробовал переводить в другие форматы - неправильный ответ. Высчитывал длину строки, получил число data_unpack эквивалентное CalcDataSize. Но как его дальше применить?

data = sock.recv(1024)
data = struct.unpack('>L', data[:4]) 
data_unpack = int(''.join(map(str,data)))-4 

В php все работает отлично - ответ в виде строки, которая выглядит как xml.

<?xml version="1.0" encoding="UTF-8"?><greeting></greeting>
Answer 1

CalcDataSize($fp) (высчитывается путем прочтения первых четырех байтов ответа, их распаковки и получения числа sz-4).

Для получения целого числа из байтов используйте

data = sock.recv(1024)
CalcDataSize = int.from_bytes(data[0:4], byteorder='big') - 4

Для получения следующего сообщения требуется прочитать из сокета данные еще раз

data = sock.recv(CalcDataSize)

Далее используйте xml парсер, если ответ приходит в данном виде

READ ALSO
pgsql.so не подключается

pgsql.so не подключается

народ! Прошу помощи, никак не получается подключить библиотеку pgsqlso и pdo_pgsql

105
Рекурсивная функция PHP (факториал числа)

Рекурсивная функция PHP (факториал числа)

Объясните, пожалуйста, как работает рекурсивная функция на примере вычисления факториала из числа 4

127
JVM, байт код, компилятор

JVM, байт код, компилятор

Никак не могу разобраться и путаюсь просто

109
Java - Enterprise и Web в чем отличие?

Java - Enterprise и Web в чем отличие?

Прочитал прилично статей, но так и не понял главную суть:

96