Как я уже говорил в вашем другом вопросе, это двоичный протокол.
Вы отправляете текст ASCII.Обратите внимание, что большое число (1801944113), если интерпретировать его как текст, равно 'kg|1'
.Это (порядок байтов) первых четырех символов, которые вы ему отправили.Другими словами, он взял первые четыре байта, которые вы отправили, интерпретировал их как двоичное значение и теперь использует его как значение длины сообщения - что, очевидно, неверно.
Вам необходимо использовать методы pack
и unpack
модуля python struct
для кодирования и декодирования двоичных значений для создания вашего буфера.
Это будет выглядеть примерно так:
import struct
trans_code = 1 # LOGIN
login_id = b'MyName'
mpassword = b'MyPass'
tpassword = b'MyTradingPass'
my_ip = b'192.168.1.31' # No idea what the point of this is
reserved = b''
msg_length = 196
msg_buffer = struct.pack("!IH30s20s20s20s100s", msg_length, trans_code,
login_id, mpassword, tpassword, my_ip, reserved)
assert len(msg_buffer) == msg_length
print("Login request to send '{}'".format(msg_buffer))
Вам нужно научиться пользоваться модулем struct
.Это хорошо указано в документации по питону.
Ваши результаты (в частности, это большое число) показывают, что сервер ожидает, что числовые поля будут закодированы в порядке байтов с прямым порядком байтов ( AKA"сетевой порядок байтов ").