-1

我编写了一个基本的 C 程序,它与客户端的 IP 地址建立连接,google.com然后开始从客户端接收数据。

但首先,在编译期间会生成以下警告:

test.c:12:25:警告:隐式声明
      函数“inet_addr”在
      C99 [-Wimplicit-function-declaration]
地址.sin_addr.s_addr=inet_addr("2...
                        ^
生成 1 个警告。

其次,在运行程序时,会生成以下输出:

HTTP/1.0 400 错误请求
内容类型:文本/html;字符集=UTF-8
推荐人政策:无推荐人
继续GET/HTTP/1.1

我可以在我的代码中进行哪些更改以成功接收来自 HTTP 服务器的数据?

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>

int main()
{
    int mySocket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in address;
    address.sin_port = htons(80);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("216.58.200.196");
    connect(mySocket, (struct sockaddr *)&address, sizeof(address));
    char msg[21] = "GET/HTTP/1.1\r\n\r\n";
    send(mySocket, msg, 21, 0);
    char msgRecv[100];
    recv(mySocket, msgRecv, 100, 0);
    printf("%s", msgRecv);
}
4

1 回答 1

1

您的代码有很多错误(缺少错误处理、误用send()recv()printf()),但 HTTP 失败的主要原因是您的 HTTP 请求格式错误。

如果您阅读 HTTP 1.1 协议规范、RFC 2616及其后续 RFC 7230-7235,您会发现在GETand之间、和/and 之间缺少必需的空格字符,并且还缺少必需的标头。/HTTPHost

至少,您的 HTTP 请求需要如下所示:

char msg[] = "GET / HTTP/1.1\r\nHost: google.com\r\n\r\n";

一旦你有这个工作,看看这个答案你需要实现的那种逻辑,以便正确接收服务器的响应(一次调用recv()不会切断它,甚至不会关闭)。

于 2020-09-19T05:36:08.097 回答