Rem*_*123 2 sockets tcp protocols network-protocols
向下选择的消息:请阅读问题,我正在开发一个小型嵌入式设备.如果你不熟悉这种设备的限制,那么请转到另一个问题而不是投票!
我正在使用内存有限的小型嵌入式设备,我需要从该设备向服务器发送大文件.因此我不能轻易使用HTTP POST,这需要我在发送之前将整个文件加载到内存中.
嵌入式设备有UDP和TCP套接字,但是要发送HTTP POST,我需要创建一个包含HTTP HEADERS和Data的字符串.由于设备没有HTTP协议或其他可用作API的协议.
有人可以推荐一个我可以用来执行"流式传输"或将数据部分发送到服务器的过程吗?
该协议需要相对简单,不会占用大量内存资源,如果您知道为小型嵌入式设备设计的库也会很好.协议也应该很容易在接收服务器上实现,最好运行.Net
我正在使用内存有限的小型嵌入式设备,我需要从该设备向服务器发送大文件.因此我不能轻易使用HTTP POST,这需要我在发送之前将整个文件加载到内存中.
不,POST
不需要.它所要求的只是Content-Length
您发送的HTTP 标头与您为实际文件数据发送的字节数相匹配.或者您可以使用HTTP 1.1的chunked
传输编码,它不使用Content-Length
标头(因此您不需要提前知道文件大小). POST
(或HTTP,就此而言)没有关于如何在代码中发送字节的概念.因此,所有必须做的是使用适当大小的内存缓冲区在循环中读取文件数据,在每次读取后通过套接字发送该缓冲区的内容,直到您点击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 ...
Run Code Online (Sandbox Code Playgroud)
要么:
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 ...
Run Code Online (Sandbox Code Playgroud)
即使是功能强大的桌面PC也必须这样做,因为整个文件通常无法一次性放入内核缓冲区,因此必须相应地进行发送.
嵌入式设备有UDP和TCP套接字,但是要发送HTTP POST,我需要创建一个包含HTTP HEADERS和Data的字符串.
您不必一次性在一个字符串中发送所有内容.您可以根据需要将其分解为多个字符串/发送.TCP是一种流传输,只要您发送的字节顺序正确,它就不关心您执行的发送数量.您可以一次发送1个字节(尽管这不会非常有效,但它会起作用).
由于设备没有HTTP协议或其他可用作API的协议.
它不需要.由于HTTP位于TCP之上,并且您可以访问TCP套接字API,因此可以手动实现HTTP.
有人可以推荐一个我可以用来执行"流式传输"或将数据部分发送到服务器的过程吗?
HTTP已经做到了这一点.
该协议需要相对简单,不会占用大量内存资源,如果您知道为小型嵌入式设备设计的库也会很好.协议也应该很容易在接收服务器上实现,最好运行.Net
HTTP完全没问题.