首页 > 解决方案 > 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 ,{ ,| ,} ,~ , ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,

有人对为什么会出错有任何想法吗?

标签: pythonc++socketsboost-python

解决方案


推荐阅读