gpt4 book ai didi

c - 字节排序 HTTP 客户端

转载 作者:行者123 更新时间:2023-11-30 16:19:29 27 4
gpt4 key购买 nike

我编写了一个简单的 HTTP 客户端,可以从主机请求数据。

我正在使用 getaddrinfo(3)。通过“GET/HTTP/1.1”请求,我能够下载给定 http 主机的 HTML 页面。

这是我的代码的一部分:

struct addrinfo hints, *ai;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET; // Internet Protocol (IP) socket
hints.ai_socktype = SOCK_STREAM; // TCP

int res = getaddrinfo("example.com", "http", &hints, &ai);
if (res != 0)
ERROR_EXIT("getaddrinfo: %s\n", gai_strerror(res));

int sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if (sockfd < 0)
ERROR_EXIT("socket: %s\n", strerror(errno));

if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0)
ERROR_EXIT("connect: %s\n", strerror(errno));

FILE *sockfile = fdopen(sockfd, "r+");
if (sockfile == NULL)
ERROR_EXIT("fdopen: %s\n", strerror(errno));

// send a GET request to the server:
if (fputs("GET / HTTP/1.1\r\n\r\n", sockfile) == EOF)
ERROR_EXIT("fputs: %s\n", strerror(errno));
if (fflush(sockfile) == EOF)
ERROR_EXIT("fflush: %s\n", strerror(errno));

char buf[1024];

// print the reply:
while (fgets(buf, sizeof(buf), sockfile) != NULL)
fputs(buf, stdout);

fclose(sockfile);
return 0;

下载 HTML 页面工作正常,但下载 PNG 图像(例如 "GET/image.png HTTP/1.1\r\n\r\n" 会得到如下所示的结果:

???????ݹh??DHDZ?yW]%?9a??J?6F?Ѧ?E???ݐTd?US?:)??I??M,?-????=??U??&???Nr? ???б??? 
b??]??8?6+?;??i䂢d?G?WA?rԺ?H[??]?Z5????g?{8??i\?qAC?@c??v.?rb??'<?T?????O?z?
q,yĜ?ŷZI???X??fM?l?Z??l:;M???ۦ?????c?\\?W6+???o?}_???紈A??GvG?p??6{??{%?????0?{?
%??ژ??l?$r<?????ft*'W?N?m߂Ҿ4??E?:^?#?&?%%
????Dw??Z?$??1?4?l%&2?f-5!?? ?E? 8...

我知道这是一个字节传输,我必须进行字节排序,但不知道从哪里开始。

我知道我需要对 PNG 图像使用 ntohl(3) 和 Big-endian 顺序。有人可以告诉我要查找什么以及如何处理这个问题吗?

我是否将此输出保存到 .png 文件,然后执行字节顺序,还是在创建 .png 文件之前执行?

最佳答案

这个问题比“字节顺序”更复杂。

好消息是字节顺序可能无关。您现在获得的代码应该可以很好地与服务器发送和接收文本字符串。

坏消息是,如果您想从服务器读取二进制数据,则需要不同连接。几点考虑:

  • 听起来您可能不需要担心“POST”、“PUT”...或除“GET”之外的任何内容。

  • 听起来您也无需担心“MIME 类型”或“uuencoding/decoding” - 您只需按原样读取数据即可。

  • 绝对应该从服务器的 HTTP 响应中读取 Content-TypeContent-Length header 。

  • 如果您正在读取二进制数据,也许最简单的方法就是在循环中调用 fgetc()。对字符串使用 fgets(),对 Content-Length 字节使用 fgetc() 来读取图像。

  • 您可能需要执行 fopen() 将图像字节写入文件。

  • 但是调用 fgets() 就无需担心“字节顺序”。

here , herehere例如。

“希望有帮助...

关于c - 字节排序 HTTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com