向下选择的消息: 请阅读问题,我正在开发一个小型嵌入式设备。如果你不熟悉这种设备的限制,那么请转到另一个问题而不是投票!!!!
我正在使用内存有限的小型嵌入式设备,我需要从该设备向服务器发送大文件。因此,我无法轻松使用HTTP POST,这需要我在发送之前将整个文件加载到内存中。
嵌入式设备有UDP和TCP套接字,但是要发送HTTP POST,我需要创建一个包含HTTP HEADERS和Data的字符串。由于设备没有HTTP协议或其他可用作API的协议。
有人可以推荐一个我可以用来执行"流媒体"或者将数据部分发送到服务器?
协议需要相对简单,不要耗尽很多内存资源,如果你知道为小型嵌入式设备设计的库也会很好。协议也应该很容易在接收服务器上实现,最好运行.Net
答案 0 :(得分:6)
我正在使用内存有限的小型嵌入式设备,我需要从该设备向服务器发送大文件。因此我不能轻易使用HTTP POST,这需要我在发送之前将整个文件加载到内存中。
不,POST
不需要。它所需要的只是您发送的HTTP Content-Length
标头与您为实际文件数据发送的字节数相匹配。或者您可以使用HTTP 1.1的chunked
传输编码,该编码不使用Content-Length
标头(因此您不需要提前知道文件大小)。 POST
(或HTTP,就此问题而言)没有 HOW 的概念,您在代码中发送了字节。因此,所有必须做的就是在循环中读取文件数据,使用适当大小的内存缓冲区,在每次读取后通过套接字发送该缓冲区的内容,直到您点击EOF。
例如(伪代码):
sckt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
connect(sckt, "hostname", 80)
send(sckt, "POST /resource HTTP/1.0\r\n")
send(sckt, "Content-Type: application/octet-stream\r\n"); // or the actual file type
send(sckt, "Content-Length: " + string(the file size) + "\r\n")
send(sckt, "\r\n")
byte buffer[256] // use whatever buffer size is appropriate for your device
do
{
numread = read(file, buffer, sizeof(buffer));
if (numread <= 0) break;
send(sckt, buffer, numread);
}
while (true);
read HTTP response from sckt ...
或者:
sckt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
connect(sckt, "hostname", 80)
send(sckt, "POST /resource HTTP/1.1\r\n")
send(sckt, "Content-Type: application/octet-stream\r\n"); // or the actual file type
send(sckt, "Transfer-Encoding: chunked\r\n")
send(sckt, "\r\n")
byte buffer[256] // use whatever buffer size is appropriate for your device
char hex[12]
do
{
numread = read(file, buffer, sizeof(buffer));
if (numread <= 0) break;
sprintf(hex, "%x", numread);
send(sckt, string(hex) + "\r\n")
send(sckt, buffer, numread)
send(sckt, "\r\n")
}
while (true);
send(sckt, "0\r\n");
send(sckt, "\r\n");
read HTTP response from sckt ...
即使是功能强大的桌面PC也必须这样做,因为整个文件通常无法一次性放入内核缓冲区,因此必须相应地进行发送。
嵌入式设备有UDP和TCP套接字,但是要发送HTTP POST,我需要创建一个包含HTTP HEADERS和Data的字符串。
你不要必须在一个字符串中一次发送所有内容。您可以根据需要将其分解为多个字符串/发送。 TCP是一种流式传输,只要您发送的字节顺序正确,它就不关心您执行的发送数量。你可以一次发送1个字节(尽管这样效率不高,但它可以工作)。
由于设备没有HTTP协议或其他可用作协议的协议。
它不需要。由于HTTP位于TCP之上,并且您可以访问TCP套接字API,因此可以手动实现HTTP。
有人可以推荐一个我可以用来执行&#34;流媒体&#34;或者将数据部分发送到服务器?
HTTP已经完全正确。
协议需要相对简单,不要耗尽很多内存资源,如果你知道为小型嵌入式设备设计的库也会很好。协议也应该很容易在接收服务器上实现,最好运行.Net
HTTP非常适合。