【发布时间】:2015-06-02 16:29:30
【问题描述】:
我写了一个 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;
}
【问题讨论】:
-
我不知道
Python是如何工作的,但我怀疑它在发送消息之前将长度作为二进制整数发送。也许应该是len = ReadBytes(sk, buf, sizeof(buf));?另外我认为您可能在recv()中计算错误的缓冲区。应该是recv(sk, ptr, n - (ptr - buf), 0);? -
@Galik 提供了 C++ 代码,应该没有问题。它不能被修改,否则我宁愿写一个 python server.anyway thx!
-
你的 C++
ReadBytes函数的 Python 等价物在哪里?!看来你忘了用 Python 实现协议了。
标签: python c++ sockets boost tcp