python套接字接收二进制数据

Posted

技术标签:

【中文标题】python套接字接收二进制数据【英文标题】:python sockets receive binary data 【发布时间】:2013-05-09 16:50:28 【问题描述】:

我无法将二进制数据接收到我的服务器 (python)。 似乎操作系统(WIN7)未经“许可”在多个数据包中发送大数据, 所以当我试图从我的客户端(C++)发送二进制数据时,我必须做一些操作来组合所有的数据。 我尝试了几种方法,但都没有奏效。

这里是发送部分(C++ - 工作正常):

sendbuf = "2011@" + ReadThisFile("C:\\0x3z4.jpg") + "@"; // buffer should be "2011@<Image Data>@"
// ReadThisFile returns string with binary data from file

vector<char> vect(sendbuf.begin(), sendbuf.end()); // Vector with the image data

iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The Image

这里是接收部分(Python - 线程函数“处理程序”的一部分):

while True:

    Buffer = Sock.recv(self.BufferSize)

    if Buffer[0:4] == "2011":
        self.Print(ADDR[0] + " > 2011 > Capture Screen Response.")

        # Save Image
        Path = datetime.now().strftime("Information\\" + ADDR[0] + "@" + self.Clients[Index].computerName + "\\CaptureScreen.Files\\" + "%d-%m-%Y-%H-%M-%S.png")

        f = open(Path,'wb')
        f.write(Buffer[5:-1])
        data = ""
            # I tried to receive data till i'll find the eof
        while True:
            data += Sock.recv(4096)
            if data.find("EOF"):
                break
        f.write(data)

这个问题来自我和几个朋友为我们的课程工作的 *** 项目。 谢谢。

【问题讨论】:

对不起,你能改写吗?不是很清楚。 【参考方案1】:

您不是在发送缓冲区,而是在发送向量的第一个 vector.size() 字节。在调试器中停止代码,检查从 &vect[0] 开始的内存,并将其与您实际接收的内容进行比较,我认为您会发现您的代码行为正确(从某种意义上说,它正在做它正在做的事情)应该,不一定是你想要的)。

我不知道 ReadThisFile 做了什么,但是您需要将要发送的字节实际放入缓冲区中,并将该缓冲区用作要发送的参数。 FWIW,ReadFile 可能至少与您尝试做的事情一样容易。祝你好运。

ReadThisFile 需要告诉你它读取了多少字节,或者你需要以另一种方式获取文件大小并推断缓冲区的长度

【讨论】:

ReadThisFile 从文件中返回带有二进制数据的字符串。我将接收到的数据与发送的数据进行了比较。两者都是一样的。问题是如何只保存我收到的特定二进制数据,直到数据结束(如何找出数据何时结束?)。我很抱歉解释不好。

以上是关于python套接字接收二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过套接字发送/接收二进制数据?

从 iOS 到 WebSockets 的二进制数据

c_cpp 使用原始套接字发送和接收带有ICMP协议的OUTPUT的数据包的小程序是六进制格式的数据包。可以打印为%c来查看数据。 IP heade

Python:将数据从扭曲的套接字读取到 SWIG 结构中

通过野兽网络套接字发送二进制数据(在 C++ 中)

在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制