首页 > 解决方案 > 通过 tcp socket 发送和接收的数据不一样

问题描述

我通过 tcp 连接发送和接收的数据不匹配。

我有一个覆盆子托管一个用 C++ 编写的 tcp 服务器。这仅由使用 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)

标签: pythonc++socketstcp

解决方案


正如您刚刚发现的,这是一种自我造成的竞争条件。修复很简单:只需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);

推荐阅读