【发布时间】:2020-06-23 14:52:46
【问题描述】:
我通过 tcp 连接发送和接收的数据不匹配。
我有一个树莓派托管一个用 C++ 编写的 tcp 服务器。这仅由使用 python 的 socket 模块的我的 python 模块使用。我发送一个字符串,服务器用一个无符号短整数响应该字符串。我发送和接收的似乎完全不同。一些例子:
| 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)
【问题讨论】:
-
count_thr是做什么的? -
它启动一个单独的线程,该线程不断更改
value。实际上可能是这样,因为它可能会在send尝试发送时更改value。