Python套接字接收和存储数据

时间:2014-08-20 13:30:15

标签: python c++ sockets byte

我在C ++程序和python脚本之间设置了一个套接字。它非常简单,我想从C程序向Python发送大约20 Hz的坐标。这只是第一次尝试,我想发送一组坐标,它看起来像这样:

C ++程序,服务器:

struct coord {
    int x;
    int y;
    int z;
 };

struct coord co;

co.x = 1;
co.y = 2;
co.z = 3;


char *msg;
msg = (char*) &co;

send(newsockfd, msg,strlen((char*) &co), 0);

这是重要的部分,我在此之前成功初始化了一个具有特定地址的套接字。现在我想将这三个坐标发送到python程序。我将地址发送到第一个整数(co.x),以及分配的内存,应该是12个字节。

这是python脚本。我再次提到了重要的内容。

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(server_address)
recvInt = sock.recv(4096)

现在我想访问前4个字节并将其存储在变量中,接下来的4个存储在一个单独的变量中,最后4个存储在第三个变量中。但是我该怎么做? recvInt就是这个,看似无用的对象Bytes,我无法将其转换成任何东西,打印输出也没有任何意义。有人可以帮助我或指出我正确的方向吗?

编辑:当我打印输出:type(recvInt)时,它表示它是一个str。考虑到函数socket.recv()的文档清楚地表明它返回一个Bytes,这也很奇怪。但是,现在我还发现该函数应该返回数据的字符串表示的文档。哪个是对的?这个假设的字符串表示只是一个带有四个数字的小盒子,看起来像一个字节的直观表示。但是,msg包含12个字节,并且在recvInt上没有索引。 谢谢

1 个答案:

答案 0 :(得分:1)

查看用于python的struct库。

基本上,根据您的情况,以下内容可能会有效。

import struct

x, y, z = struct.unpack("!iii", receivedData)

上面的代码会将收到的字符串解析为3个有符号整数。

socket.recv返回二进制字符串,该字符串本质上是一个字节数组。 Python没有为recvInt或parseInt提供单独的函数,而是提供了一个库来将任意二进制字符串解析为不同大小的整数或字符串。