python - C++ 读取 Python 套接字数据不正确
问题描述
假设我有一个服务器和一个客户端。
服务器
我在下面生成了一些数值数据,通过SerializeDebug
它返回一个std::vector<uint8_t>
. 然后我通过convert
. 然后,在 python 中,我通过套接字将数据发送到客户端。
客户
我在 Python 中接收数据并将其传递到数值计算库的另一端进行反序列化。
代码
C++代码如下
using ByteThing = std::vector<uint8_t>;
ByteThing SerializeDebug(){
ByteThing toRet(240, 0);
for (int i=0; i < 240; i++){
toRet[i] += i;
}
return toRet;
};
void DeserializeDebug(const boost::python::list &pyvals){
std::cout << "DEBUGGING DEBUG MESSAGE: \t";
for (unsigned int i = 0; i < len(pyvals); i++) {
std::cout << boost::python::extract<uint8_t>(pyvals[i]) << " ,";
}
}
static PyObject *convert(const ByteString &vector) {
auto *pythonList = new boost::python::list();
for (auto &el: vector){
pythonList->append(el);
}
return pythonList->ptr();
}
用于发送和接收数据的 python 代码如下所示:
def _safe_send_unencrypted_obj(socket: Socket, obj: Any) -> None:
socket.sendall(_add_header_to_payload(dill.dumps(obj)))
while True:
logger.debug("_safe_send_unenc_obj: Waiting for confirmation")
res = socket.recv(BUFFER_SIZE)
if res:
logger.debug("Receipt confirmed from other party")
break
def _safe_recv_unencrypted_obj(socket: Socket):
expected_length = _get_obj_size(socket)
logger.debug(f"_safe_recv_unenc_obj: Expected size: {expected_length}")
running_length = 0
running_msg = b""
while running_length < expected_length:
msg = socket.recv(BUFFER_SIZE)
if msg:
running_length += len(msg)
running_msg += msg
socket.send(_add_header_to_payload(b"ACK"))
logger.debug("_safe_recv_unenc_obj: Received all data")
return running_msg
def server_run():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(
socket.SOL_SOCKET,
socket.SO_REUSEADDR,
1,
)
s.bind((socket.gethostname(), ADDRESS))
s.listen(5)
clientsocket, address = s.accept()
logger.info("Accepted connection")
interface = pycrypto.CKKSwrapper()
data = interface.SerializeDebug()
_safe_send_unencrypted_obj(clientsocket, obj=data)
def client_run(crannog_parameters):
serversocket: Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.connect((socket.gethostname(), ADDRESS))
serversocket.setblocking(True)
resp = _safe_recv_unencrypted_obj(serversocket)
resp: List[int] = dill.loads(resp)
interface = pycrypto.CKKSwrapper()
interface.DeserializeDebug(list(resp))
服务器结果
CPP 字节的东西-> Python 是正确的。我打开了调试器并验证了这些值是否符合预期。
CPPvector<uint8_t>: [0, 1, ..., 240]
PythonList[int]: [0, 1, ..., 240]
然后我将它发送给客户
客户结果
unpickling 后,我得到了预期的结果(在调试器中检查)
此时,我有一个长度为 240 的数组:[0, 1, ..., 240]
当我调用 interface.DeserializeDebug(resp) 时,我得到
DEBUGGING DEBUG MESSAGE: , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , ,! ," ,# ,$ ,% ,& ,' ,( ,) ,* ,+ ,, ,- ,. ,/ ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,: ,; ,< ,= ,> ,? ,@ ,A ,B ,C ,D ,E ,F ,G ,H ,I ,J ,K ,L ,M ,N ,O ,P ,Q ,R ,S ,T ,U ,V ,W ,X ,Y ,Z ,[ ,\ ,] ,^ ,_ ,` ,a ,b ,c ,d ,e ,f ,g ,h ,i ,j ,k ,l ,m ,n ,o ,p ,q ,r ,s ,t ,u ,v ,w ,x ,y ,z ,{ ,| ,} ,~ , ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,
有人对为什么会出错有任何想法吗?
解决方案
推荐阅读
- python - 如何将 pandas DataFrame 转换为 reportlab 模块中的表格?
- firebase - 查询算作 Firestore 中的读数吗?
- javascript - S3 在 Promise 中下载到 FileStream?
- javascript - 为光滑滑块设置高度仅在页面完成加载后运行
- corda - 无法使用 Corda V3 编译核心源项目
- python - Gunicorn/Flask 应用程序的 HTTP 客户端在 POST 请求未能响应时抛出 I/O 错误
- sequelize.js - 由于本地主机解析,无法通过 Sequlize 连接到 mysql
- sed - 如何使用`sed`在一行和另一行之间打印?
- php - 用于确定字符串特定特征的正则表达式(即扑克手)
- android - 以 Intent 标志 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 启动的 Activity 未收到结果