данные, отправленные и полученные через сокет TCP, не совпадают - PullRequest
0 голосов
/ 11 марта 2020

Мои данные, отправленные и полученные через tcp-соединение, не совпадают.

У меня есть малина, на которой размещен tcp-сервер, написанный на c ++. Это используется только моим python модулем, использующим python 'socket модуль. Я отправляю строку, на которую сервер отвечает коротким целым числом без знака. То, что я отправляю и получаю, кажется совершенно другим. Некоторые примеры:

| sent in hex | received as string |
| ----------- | ------------------ |
| 0xb6fc      |  b'\x0b\xaa'       | 
| 0x80f5      |  b'\xb6h'          |
| 0xf93b      |  b'X\xec           |
| 0x3167      |  b'\x95\x1b'       |

Единственным постоянным фактором является размер. Всегда есть 2 отправленных байта и 2 полученных байта. Я попытался использовать struct.unpack на полученных данных и получил совершенно другое значение.

исходный код

это работает на сервере

unsigned short value = 0;

std::thread count_thr(counter, &toggle, &value);

while (1){
            memset(buf, 0, sizeof(buf));
            received = recv(new_fd, &buf, sizeof buf, 0);
            printf("received string: %s\n", buf);

            if (strcmp(buf, "exit") == 0){
                    printf("closing server...\n");
                    close(new_fd);
                    exit(0);
            }
            else if (strcmp(buf, "get") == 0){
                    int bytes_sent = send(new_fd, &value, sizeof value, 0);
                    printf("sending value: %x\nbytes sent: %i\n", value, bytes_sent);
            }
    }

и это на клиент

try:
sock.sendall('get'.encode())
    data = sock.recv(32)
    length = len(data)
    print('data received: %s\nlength: %i' % (data, len(data)))
except OSError as error:
    msg = str(error)

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Как вы только что обнаружили, это вызванное самими собой состояние гонки. Исправить это просто: просто возьмите локальную копию value, которая не будет изменена внешним потоком перед отправкой:

unsigned short copy = value;
int bytes_sent = send(new_fd, &copy, sizeof copy, 0);
printf("sending value: %x\nbytes sent: %i\n", copy, bytes_sent);
0 голосов
/ 11 марта 2020

Как сказал Ботье, у меня было состояние гонки, поскольку данные value постоянно менялись при его отправке. Другой проблемой были неясные данные, которые я получил, но оказалось, что это были символы ASCII вместо шестнадцатеричного представления байта.

с этим разобрались,

decoded_val = struct.unpack('<H', data)[0]

эта строка решила мою проблему. Я добавил [0], поскольку unpack вернул кортеж, а первый элемент содержал правильное значение.

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