【问题标题】:How to send POST Request and receive GET response如何发送 POST 请求并接收 GET 响应
【发布时间】:2014-07-13 23:57:28
【问题描述】:

我正在尝试发送一个 POST 请求并接收一个 GET 响应作为回报。

这是我的代码:

#define IP "87.98.245.77"
#define Port 80

void getGETMessage(SOCKET s)
{
char *data = new char[2000];

recv(s, data, strlen(data), NULL);

int x = 3;
}

void SendPOSTMessage(SOCKET s)
{
string data = "POST /index.php?p=convert HTTP/1.1"
            "Host: convert2mp3.netConnection: keep-alive"
            "Content-Length: 80";
            "Cache-Control: max-age=0"
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
            "Origin: http://convert2mp3.net"
            "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
            "Content-Type: application/x-www-form-urlencoded"
            "Referer: http://convert2mp3.net/index.php?p=home"
            "Accept-Encoding: gzip,deflate,sdch"
            "Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2,fr;q=0.2";

if (send(s, data.c_str(), data.length(), NULL) < data.length())
{
    cout << "Error : " << WSAGetLastError() << endl;
    return ;
}

getGETMessage(s);
}

int main()
{
char *data = new char[200];

 WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(IP); // IP
clientService.sin_port = htons(Port); // Port

iResult = connect(ConnectSocket, (SOCKADDR *)& clientService, sizeof(clientService));

if (iResult == SOCKET_ERROR)
{
    cout << "Error" << endl;
    return 0;
}

SendPOSTMessage(ConnectSocket);

cin.get();
cin.get();
}

由于某种原因,我没有得到任何回报... 我尝试获取此网站的 IP: http://convert2mp3.net/index.php?p=home 并使用 cmd,它告诉我它是 http://87.98.245.77/,但它没有加载到我的浏览器中......也许这是我的错误?

谢谢!

【问题讨论】:

    标签: c++ sockets http post get


    【解决方案1】:

    问题(至少一个)出在这部分代码中:

    void getGETMessage(SOCKET s)
    {
    char *data = new char[2000];
    
    recv(s, data, strlen(data), NULL);
    
    int x = 3;
    }
    

    你没有初始化数据,所以,可能有任何符号,所以 strlen(data) 可能返回 0,如果第一个符号是 '\0',或者其他什么,取决于 '\0' 何时出现. 尝试将 strlen 更改为 sizeof。

    类似的东西:

    void getGETMessage(SOCKET s)
    {
    char data[2000] = {0};
    
    recv(s, data, sizeof(data)-1, NULL);
    cout << data << endl;
    int x = 3;
    }
    

    【讨论】:

    • @ke4ktz 标记您设置了消息长度,但不发送消息正文。也许有问题?我会和他一起建议你使用一些指定的库,比如 libcurl。
    • @Amit 我的回答解释了原因。
    【解决方案2】:

    根据您的代码,您只发送标头信息。您将 Content-Length 指定为 80,但您没有发送任何数据。因此,服务器仍在等待数据,尚未向您发送响应。

    我的建议是使用一些 HTTP 库,而不是尝试自己执行所有低级功能。这个Stack Overflow question有一些建议。

    【讨论】:

    • 我宁愿自己用低级。那么,我该如何发送消息呢?我的意思是,我该怎么写? Message: 什么的?
    • 您的响应正是您应该使用 HTTP 库而不是自己做低级工作的原因。您需要对 HTTP 数据包格式有很好的理解才能正确完成它。此外,在某些情况下,您必须使用不同的标头信息重新发送。
    • 我发现了我的错误:1)我忘了添加\r\n 2)我也在里面添加了一条消息。现在,我收到404 page not found 错误...我不知道为什么.. 这是网站:http://convert2mp3.net/index.php?p=home,它的 IP 是:http://87.98.245.77/index.php 那么我做错了什么?
    • 好吧,您的问题似乎得到了回答:您只是发送了标题而不是数据。现在您需要处理标题的格式。您的 POST 标头不正确。查询参数不去那里...只有 URL。
    • 我已经更改了我的 Post 数据,并且也发送了数据,但看起来我发送的地方不太好。如果我有域,并且我有它的 IP,为什么当我尝试从 GOogle Chrome 进入 / 使用 SOCKETS 时会得到 404?
    【解决方案3】:

    您的数据无效。每个 HTTP 标头都需要由 \r\n 终止,并且您需要在最后一行标头之后再添加一个。而且您发送的内容长度为 80,但没有内容。

    补充说明:

    1. 如果 send() 返回一个正整数,则调用 WSAGetLastError() 是没有意义的。没有错误,所以你会得到未定义的。您应该检查 -1。实际上,除非您处于非阻塞模式,否则 send() 不会返回短计数。

    2. NULL 不是 send() 或 recv() 的正确第四个参数,但 0 是。

    3. 没有“GET 响应”之类的东西。只有 HTTP 响应。

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多