2013-04-29 157 views
1

我试图提出GET/POST请求。 GET请求现在。我能够建立连接,但我得到的回应永远不会200 OK。这里是代码使用套接字发出Http请求

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请求。 Thx提前研究员

<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 
+0

非常雄心勃勃的项目:+1。尼尔斯提出了一个很好的建议:标准和建议。你可以简单地通过_telneting_到你的服务器(在端口80上)并发出一个'GET /'命令来测试他的答案。 – 2013-04-29 10:54:39

回答

4

你的问题是在这里:

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

HTTP协议定义了一个请求作为<method> <resource> [HTTP/<version>]。版本默认为1.0,在1.0中你只需要在最后一个换行,你请求的资源是网页,所以这应该是:

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

我建议对HTTP的读了如果你想实现一个自定义的客户端,那么它也应该可以帮助你构建一个POST请求。并且请升级到HTTP/1.1,而不是所有的网络服务器都觉得有义务支持1.0。

RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

+0

你可能也想要一个'Host:'头文件。 – 2013-04-29 11:01:11

+0

Thx for replying ....我试过char * sendbug =“GET 173.194.66.99 HTTP/1.0 \ r \ n”;就像你所说的那样,但答案仍然是一样的。而HTTP/1.1头看起来有点复杂,所以我试图用1.0发送请求。 – Azerue 2013-04-29 11:03:56

+1

@MikeWeller'Host'头只存在于HTTP/1.1中,与1.0请求无关。 – 2013-04-29 11:10:22