клиент сокета python ничего не отправляет - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь сделать интеграцию через сокет HTTP. Я использую python для создания клиента сокетов и отправки данных на сервер сокетов, созданный в C.

Как видно на следующих изображениях, в документации по интеграции приведен пример на C, который показывает, как я должен отправлять данные на сервер:

Пример документации по интеграции:

1- определить типы записей / структур для заголовка сообщения и для каждого формата сообщения

2- Объявление / создание объекта сокета клиента

3- Открыть компонент сокета в неблокирующем режиме

4- объявите переменную типа структуры данных, относящуюся к функции API, которую вы хотите вызвать, - затем заполните ее правильными данными (включая заголовок). Скопируйте данные структуры в байтовый массив и отправьте их через сокет

Я пытался сделать это с помощью модуля ctypes из python:

class SPMSifHdr(ctypes.Structure):
    _fields_ = [
        ('ui32Synch1', ctypes.c_uint32),
        ('ui32Synch2', ctypes.c_uint32),
        ('ui16Version', ctypes.c_uint16),
        ('ui32Cmd', ctypes.c_uint32),
        ('ui32BodySize', ctypes.c_uint32)
    ]

class SPMSifRegisterMsg(ctypes.Structure):
    _fields_ = [
        ('hdr1', SPMSifHdr),
        ('szLisence', ctypes.c_char*20),
        ('szApplName', ctypes.c_char*20),
        ('nRet', ctypes.c_int)
    ]

body_len = ctypes.sizeof(SPMSifRegisterMsg)
header = SPMSifHdr(ui32Synch1=0x55555555, ui32Synch2=0xaaaaaaaa, ui16Version=1, ui32Cmd=1, ui32BodySize=body_len)
body = SPMSifRegisterMsg(hdr1=header, szLisence='12345', szApplName='MyPmsTest', nRet=1)

socket_connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# config is a dict with the socket server connection params
socket_connection.connect((config.get('ip'), int(config.get('port'))))

socket_connection.sendall(bytearray(body))
socket_connection.recv(1024)

Когда я вызываю функцию сокета recv, она никогда не получает ничего, поэтому я использовал инструмент Windows для проверки отправленных данных, и, как вы можете видеть на следующем рисунке, кажется, что любые данные отправляются: Сокет нюхает

Я пытался отправить даже простую строку "Hello! World", и результат всегда одинаков.

Розетка открыта. Я знаю это, потому что вижу, сколько соединений открыто с панели сервера.

Что я делаю не так?

1 Ответ

0 голосов
/ 14 марта 2019

Ошибка состояла в том, что программа SocketSniff показывает только отправленные данные, если сервер возвращает ответ.В этом случае сервер никогда не возвращал ничего, потому что некоторые байты отсутствовали.

Я обнаружил, что создал свой собственный эхо-сервер сокетов и проверил, что данные, которые я отправлял, были неполными.

Загадка решена.: D

...