一种简单的TCP协议,用于将“大”数据文件传输到服务器

时间:2015-03-01 08:29:24

标签: sockets tcp protocols network-protocols

向下选择的消息: 请阅读问题,我正在开发一个小型嵌入式设备。如果你不熟悉这种设备的限制,那么请转到另一个问题而不是投票!!!!

我正在使用内存有限的小型嵌入式设备,我需要从该设备向服务器发送大文件。因此,我无法轻松使用HTTP POST,这需要我在发送之前将整个文件加载到内存中。

嵌入式设备有UDP和TCP套接字,但是要发送HTTP POST,我需要创建一个包含HTTP HEADERS和Data的字符串。由于设备没有HTTP协议或其他可用作API的协议。

有人可以推荐一个我可以用来执行"流媒体"或者将数据部分发送到服务器?

协议需要相对简单,不要耗尽很多内存资源,如果你知道为小型嵌入式设备设计的库也会很好。协议也应该很容易在接收服务器上实现,最好运行.Net

1 个答案:

答案 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非常适合。