使用固定大小的缓冲区将任意POST数据写入套接字

时间:2018-11-15 09:34:13

标签: python sockets buffer micropython

前言:下面的代码是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内存,我有溢出的风险。

0 个答案:

没有答案