Как проверить, работает ли сокетное соединение и буферизируется или запрос неверен? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытался понять это, и, похоже, не могу обернуться вокруг него.

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server = '192.168.1.7'
port = 8000
buffer_size = 4096


request = '1|gkdgdfg49|sdfsdfsd*|sdsfsf*|'+server
request = request.encode()
s.connect((server,port))

s.send(request)
x = s.recv(buffer_size)

Документация для серверной части:

https://www.sharekhan.com/Upload/General/TradeTigerAPIForClient.pdf

log из api server показывает:

[I]  "API Client Socket Connected with error Code=0"2018-09-22                               16:07:23.555+05:30  
[I]  "Hurraay You have Connected."2018-09-22 16:07:23.555+05:30  
[I]  "Received Bytes Count = 49 Data Length = 1801944113 Thread State = Background, WaitSleepJoin , Queue Count = 0"2018-09-22 16:07:23.555+05:30  
[I]  "API Client Request Data Length 1801944113 bytes needs to read"
     2018-09-22 16:08:21.984+05:30  
[I]  "Received Bytes Count = 49 Data Length = 1801944113 Thread State =        Background, WaitSleepJoin , Queue Count = 0"
  2018-09-22 16:08:21.984+05:30  
[I]  "API Client Request Data Length 1801944113 bytes needs to read"|Reserved = |

Правильно ли request?data передается?

Если я перезапущу

s.send(request)
x = s.recv(buffer_size)

Ничего не происходит.Переводчик застрял при выполнении двух указанных выше строк.

Буду признателен за любую помощь.Очень плохо знаком с `сокетами, и документация не очень полезна.

1 Ответ

0 голосов
/ 22 сентября 2018

Как я уже говорил в вашем другом вопросе, это двоичный протокол.

Вы отправляете текст 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"сетевой порядок байтов ").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...