Nightpoison Ответов: 1

Получение данных, массив данных в шестнадцатеричном представлении, из скрипта Python за сокета в C


Я пытаюсь получить данные через сокет-соединение из скрипта python. Похоже, я не знаю, как получить эти данные.

intreadETH(intsock, char **msg){
    printf("Read\n");
    int n;
    *msg = (char *)malloc(sizeof(char) * 256);
    bzero(*msg, 256);
    n = read(sock, *msg, 255);
    return n;
}


Это простая функция чтения.

Я успешно передал сообщение с хост-компьютера(python) на сервер(C) с помощью простого сообщения. Мой код python предназначен только для тестирования прямо сейчас.

import socket
import time

HOST = '192.168.99.149'  # The server's hostname or IP address
PORT = 8080        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    time.sleep(2)
    s.sendall(b'Hello, world\r')
     s.detach()
     s.close()


Это работает, сервер получает полное сообщение "Привет, мир" без каких-либо проблем. Затем я могу отправить сообщение столько раз, сколько захочу, без каких-либо проблем.

Что я уже пробовал:

Теперь, если я изменю скрипт python, чтобы он выглядел так.
import socketimport time

HOST = '192.168.99.149'  # The server's hostname or IP address
PORT = 8080        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.connect((HOST, PORT))
    time.sleep(2)
    packet = bytearray()
    packet.append(0xBF)
    packet.append(0xAB)
    packet.append(0xCD)
    packet.append(0xEF)
    packet.append(0x0D)
    
    bytePacket = bytes(packet)
    s.sendall(bytePacket)
    time.sleep(2)
    s.detach()
    s.close()


Как исходный сценарий, так и этот обновленный сценарий отправляют сообщения типа байт с возвратной кареткой. Поэтому они выглядят и думают, что они идентичны на стороне питона. Однако я чувствую, что на стороне сервера(C) они разные.

когда я отправляю сообщение, я получаю то, что выглядит как четыре перекрывающихся алмаза с ? в каждом из них.

Я попытался внести изменения в инструкцию print, но получаю предупреждения, если изменяю инструкцию print на %d, %x или %c. Думая, что форматер просто нужно было изменить.

Есть ли у кого-нибудь какое-нибудь представление о том, что я упускаю?

1 Ответов

Рейтинг:
9

KarstenK

При использовании sendall вы должны указать правильный тип данных для входного параметра. А это уже байты и нет байтсаррей. Это может быть небольшая, но важная разница.

Лучше всего создать буфер отправки вне вызова sendall, а не встроенный.


Nightpoison

@karsenk

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

Rick York

Данные, которые вы отправляете, не совсем читаются в текстовой консоли. Это просто куча персонажей. Попробуйте отправить что-то, что является реальной текстовой строкой, например "abcdefg". Если это не совсем то, что вы хотите, то отобразите полученные значения в шестнадцатеричном формате, так как именно так вы их загружаете.

Одно должно быть ясно : вы не посылаете шестнадцатеричный массив. Вы отправляете набор из пяти символов. Значения символов могут варьироваться от 0 до 255. Вы загружаете символы в массив в шестнадцатеричном формате, но это не имеет значения. Вы могли бы загрузить символы 0x31, 0x32 и 0x33, если бы захотели. Они, оказывается, эквивалентны "1", " 2 " и " 3 " в формате ASCII.

Nightpoison

Ладно, это имеет смысл. Я обновил свой код и теперь вижу правильные символы, когда использую "1", " 2 " и т. д. Теперь, когда я вижу, что могу вытащить исходные данные, 0xBF и т. д., и отобразить их с помощью %x. Я готов. Спасибо Вам за вашу проницательность и помощь.