【问题标题】:Make a Http Request With Sockets使用套接字发出 Http 请求
【发布时间】:2013-04-29 10:45:13
【问题描述】:

我正在尝试发出 GET/POST 请求。现在 GET 请求。我能够建立连接,但我得到的响应永远不是 200 OK。这是代码

   int socketFD;
    struct sockaddr_in myaddr;
    //    struct sockaddr_in hints;
    socketFD = socket(AF_INET, SOCK_STREAM, 0);
    if (socketFD == -1) {
        NSLog(@"Error in making socket");
    }      
    myaddr.sin_port = htons(80);
    memset(&myaddr.sin_zero, '\0', 8);


    char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n\r\n";


    struct sockaddr_in dest,their_addr;
    //    struct addrinfo *res;
    struct sockaddr sockAddrToDisplay;

    dest.sin_family = AF_INET;
    dest.sin_port = htons(80);
    NSLog(@"%s",sendbug);
    dest.sin_addr.s_addr = inet_addr("173.194.66.99"); // IP for google


    int connectResult =    connect(socketFD, (struct sockaddr *)&dest, sizeof(struct sockaddr));

    if (connectResult == -1) {
        NSLog(@"Error connecting");
    }

    int sendResult =   sendto(socketFD, sendbug, strlen(sendbug), 0, (struct sockaddr *)&dest, sizeof(struct sockaddr));

    if (sendResult == -1) {
        NSLog(@"Sendind failed");
    }

    //    int peerResult =    getpeername(socketFD, (struct sockaddr *)&dest,(socklen_t *) sizeof(struct sockaddr));


    struct addrinfo hints, *res;
    int sockfd;
    int byte_count;
    socklen_t fromlen;
    struct sockaddr_storage addr;
    char buf[512];
    char ipstr[INET6_ADDRSTRLEN];


    fromlen = sizeof addr;
    byte_count = recvfrom(socketFD, buf, sizeof buf, 0,(struct sockaddr *) &addr, &fromlen);

    NSLog(@"%s",buf);

以及响应。我在做错的地方需要一些帮助,以及如何发出 http POST 请求。提前谢谢各位同学

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.3.7</center>
</body>
</html>
∑¥ëXnr

【问题讨论】:

  • 一个雄心勃勃的项目:+1。 Niels 提供了一个很好的建议:标准和建议。您可以通过 telneting 到您的服务器(在端口 80)并发出 GET / 命令来测试他的答案。

标签: ios sockets


【解决方案1】:

你的问题在这里:

char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n\r\n";

HTTP 协议将请求定义为&lt;method&gt; &lt;resource&gt; [HTTP/&lt;version&gt;]。版本默认为 1.0,在 1.0 中你只需要一个换行符结束,你请求的资源是主页,所以应该是:

char *sendbug = "GET /\r\n";

如果您尝试实现自定义客户端,我建议您阅读 HTTP-RFC,这也应该有助于您构建 POST 请求。并且请升级到 HTTP/1.1,并不是所有的网络服务器都觉得有义务支持 1.0。

RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

【讨论】:

  • 您可能还想要一个Host: 标头。
  • 谢谢回复....我试过 char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n" ;就像你说的,但反应仍然是一样的。 HTTP/1.1 标头看起来有点复杂,所以我尝试使用 1.0 发送请求。
  • @MikeWeller Host 标头仅存在于 HTTP/1.1 中,与 1.0 请求无关。
  • @Azerue 如果您感谢我的回答,请至少尝试阅读它,您仍将 IP 地址作为资源发送,而不是您应该发送的 /
  • 谢谢各位,我实际上使用 char *sendbug = "GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n" 得到了 200 OK 响应;跨度>
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多