python - C++ 服务器无法通过套接字从 python 客户端读取我的消息

标签 python c++ sockets boost tcp

我写了一个 python 客户端脚本来通过 tcp 向服务器发送消息。

import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 12003
BUFFER_SIZE = 1024
MESSAGE = b"Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print "received data:", data

服务器可以接收到我的数据,但似乎无法读取数据。日志信息复制如下。

I0328 21:45:24.493249   505 prset04.cpp:210] reading the message (3472609771221168177 bytes)
E0328 21:45:25.493088   505 prset04.cpp:162] unable to receive on socket
I0328 21:45:25.493285   505 prset04.cpp:215] echoing the message
E0328 21:45:25.493479   505 prset04.cpp:185] unable to send on socket

我认为 C++ 套接字模块和 Python 之间可能存在一些不同之处。但我不知道那里出了什么问题,因为我不熟悉 C++ 和套接字。

任何想法或解释都会非常有帮助!

谢谢

服务器代码:

static void OnClient(const int sk) {
    size_t len;
    char buf[1024];

    // Read the message length.
    if (!ReadBytes(sk, reinterpret_cast<char*>(&len), sizeof(len))) {
        LOG(ERROR) << "unable to read message length";
        return;
    }

    LOG(INFO) << "reading the message (" << len << " bytes" << ")";

    // Read the message.
    ReadBytes(sk, buf, len);

    LOG(INFO) << "echoing the message";

    // Echo the message.
    WriteBytes(sk, buf, len);
}

static bool ReadBytes(const int sk, char* buf, const size_t n) {
    char* ptr = buf;
    while (ptr < buf + n) {
        if (!SetReadTimeout(sk)) {
            return false;
        }

        auto ret = recv(sk, ptr, ptr - buf + n, 0);
        if (ret <= 0) {
            LOG(ERROR) << "unable to receive on socket";
            return false;
        }

        ptr += ret;
    }

    return true;
}

最佳答案

正如 Galik 所说,Python 不会像您的程序所期望的那样在字符串之前发送字符串的长度。 C/C++ 也不会这样做。

如果您希望您的 Python 程序与您的 C 程序一起工作,您必须考虑几件事情:

  1. 使用 struct 模块将您的字符串打包成所需的长度
  2. 打包字符串时使用网络字节顺序
  3. 你应该知道像size_t这样的声明依赖于体系结构,并且在 64 位和 32 位体系结构之间有所不同。您可以使用固定大小的整数,例如 uint32_t如果您希望它们在架构之间兼容。

示例代码:

from struct import pack
message = "Hello World"
data = pack('!i%ds' % len(message), len(message), message))

如果您不能更改 C 代码以使用网络字节顺序,您的具体代码应如下所示:

from struct import pack
message = "Hello World"
data = pack('<Q%ds' % len(message), len(message), message))

< = 使用小端字节顺序

Q = 使用无符号 64 位整数(在 64 位架构上为 sizet_t)

关于python - C++ 服务器无法通过套接字从 python 客户端读取我的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29332973/

相关文章:

Python:对象没有metadata_parser 0.6.6的属性

c++ - 是否可以在具有不同返回类型的不同类中使用类似的成员?

java - 如何: Java Server Socket response and Client reading

python - 一起运行 Fabric 和 Python 脚本

python - Django:向每个 ManyToMany Field 选项添加更多字段

c++ - CUDA 动态索引

python - 如何在 ssl python 套接字中设置密码

linux - 通过 802.11n 的 UDP 单播 - L2 积极 ACK 对 Linux 套接字发送缓冲区的影响

Python:未安装 _imagingft C 模块

c++ - Boost 中使用 Posix Time 的线程超时