0

我用C写了一个小 SocketWrapper只是为了学习,它可以工作。我正在发送一个 GET 请求并接收一个缓冲区 [1024]。但是我想阅读的内容往往比1024长,如何确定长度并接收整个数据?

#include <stdio.h>
#include <stdbool.h>

#include "lib/output.h"
#include "lib/network.h"

int main(int argc, char *argv[]) {
debug_verbose = true;

struct IPv4_CLIENT client;
client = socketIPv4("google.com", 80);

if(socketIPv4_connect(client) < 0) {
    error("Connect failed!");
    return -1;
}   

char send_buffer[256];
bzero(send_buffer, 256);

printline("Send: ");
fgets(send_buffer, 255, stdin);

socketIPv4_write(client, send_buffer);

char receive_buffer[1024];
socketIPv4_read(client, receive_buffer, 1024);
hexdump(receive_buffer, 1024);

socketIPv4_close(client);

return 0;
}
4

2 回答 2

2

使用 TCP/UDP 时,您无法确定要接收的数据的总长度。所以你应该在这个底层协议上实现一个协议来确定要接收的总长度。因此,一旦您了解了大小,您就会期望并读取这些数据。

在这里,在您的HTTP情况下,标准定义了一个单独的标头Content-Length,用于给出body的总长度。但是,要读取标头,您可以接收任意数量的数据,直到您收到所有标头,然后是给定数量的正文内容。

阅读规范以了解标题、正文、分隔符..

于 2013-07-05T14:01:38.980 回答
2

考虑以下两种方法之一:

  • 在实际数据之前发送您要传输的数据的大小。使用固定长度格式来传输大小。

  • 定义任何标记数据结束的分隔符,并继续重新分配接收缓冲区,直到收到分隔符。

于 2013-07-05T13:53:52.223 回答