我正在尝试构建一个简单的TCP HTTP客户端,它将图像的url作为参数,下载并将其写入stdout,然后将其传送到文件。
我的程序中的下载似乎工作正常,但我无法获取HTTP内容的提取和写入stdout工作。以下是相关代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define BUF_SIZE 1024
#define RESP_BUF_SIZE 2000000
void extract_http_body(char *resp_buf, char *data) {
data = strstr(resp_buf, "\r\n\r\n") + 4;
}
int main(int argc, char* argv[]) {
int sockfd, received;
char host[BUF_SIZE], path[BUF_SIZE], send_buf[BUF_SIZE], resp_buf[RESP_BUF_SIZE], data[RESP_BUF_SIZE];
char HTTP_PORT[3] = "80";
struct addrinfo hints, *res, *p;
/* SOCKET STUFF HERE, WORKS FINE */
/* Recv response */
if ((received = recv(sockfd, resp_buf, RESP_BUF_SIZE-1, 0)) == -1) {
perror("Error while receiving response.");
exit(1);
}
resp_buf[received] = '\0';
extract_http_body(resp_buf, data);
fwrite(data, strlen(data), 1, stdout);
close(sockfd);
return 0;
}
我使用this图像进行测试,这是43kB,因此应该可以很好地适应缓冲区。
如果有人能让我走上正轨,那将会很棒!
答案 0 :(得分:1)
这个功能在这里:
void extract_http_body(char *resp_buf, char *data) {
data = strstr(resp_buf, "\r\n\r\n") + 4;
}
只会将本地data
变量设置为strstr
的返回值。您不会在该功能之外看到此值
您可以返回值:
char* extract_http_body(char *resp_buf) {
return strstr(resp_buf, "\r\n\r\n") + 4;
}
或传递指向指针的指针:
void extract_http_body(char *resp_buf, char **data) {
*data = strstr(resp_buf, "\r\n\r\n") + 4;
}
然后,您在data
中将main()
声明为数组。这需要您将内容从resp_buf
复制到data
,这是不必要的。相反,您可以将data
声明为char*
,并使用上述内容将其设置为resp_buf
内数据的开头,并避免不必要的副本。