首页 > 解决方案 > 将任意 POST 数据写入具有固定大小缓冲区的套接字

问题描述

前言:下面的代码是 micropython 并且在微控制器上工作,我想问题本身是平台独立的并且与套接字的工作方式有关,我真的很新。

在一个应用程序中,我使用套接字将数据从 i2c eeprom 发送到服务器。

import usocket

buf = bytearray(64)
#...
socket = usocket.socket(*addrinfo[:3])
socket.connect(addrinfo[-1])
#...
socket.write('{0} /{1} HTTP/1.0\r\n'.format(method, path))
socket.write('Host: {0}\r\n'.format(host))
socket.write(b'Content-Length: {0}\r\n'.format(eeprom.payload_size))
socket.write('\r\n')
#... fill buf with eeprom data...
socket.write(buf)

这适用于少量数据。

问题是数据可能超过 64 字节——eeprom 是 8kbytes,理论上我可能需要全部发送——我想将所有数据写入同一个套接字,一遍又一遍地重用同一个缓冲区。

我尝试使用迭代器,只发送第一个缓冲区,后面的 socket.write 丢失

def ipayload(self, buf):
    size = len(buf)
    for memaddr in range(self.__head_pointer, self.__tail_pointer, size):
        self.read_into(memaddr, buf)
        yield min(self.__tail_pointer - memaddr, size)

#...
for c in eeprom.ipayload(buf):
    socket.write(buf)

服务器端我使用 PHP 并读取整个输入流(我猜):

$content_lenght = $_SERVER['CONTENT_LENGTH'];
$input = fopen('php://input', 'rb');
while (!feof($input) && $data = fread($input, 8)){
    $content_lenght -= 8
    //use data
}

还检查$_SERVER['CONTENT_LENGTH']$content_lenght显示我总是得到 64 个字节,所以只有第一个缓冲区。

我能怎么做?目前,我每次从 eeprom 读取时都让 python 为一个新的字节串分配内存,如果要发送完整的 4Kb,我就有溢出的风险。

标签: pythonsocketsbuffermicropython

解决方案


推荐阅读