首页 > 解决方案 > 尝试发送 HTTP POST 请求时,recv() 总是返回 0

问题描述

我正在尝试使用 HTTP 发布请求从谷歌地理定位 API 获取位置信息,但是在我发送查询后连接出现问题,我得到 0 作为 recev() 的返回值

发送帖子请求的方式是问题吗?

为什么我发送请求后连接关闭?我应该怎么做才能保持连接活跃?

#include <windows.h>
#include <winsock.h>
#include <string.h>
#pragma comment(lib, "Ws2_32.lib")

char content[1500];

#define constGLReq  \
    "POST /geolocation/v1/geolocate?key=AIzaSyBibyFS6jV3OgPxIZkFp_t97G_THjrq0Z4; sensor=false HTTP/1.1\r\n" \
        "Host: www.googleapis.com\r\n" \
        "Connection: close\r\n" \
        "Cache-Control: no-cache\r\n" \
        "Connection: keep-alive\r\n" \
        "Content-Type: application/json\r\n" \
        "Content-Length: 0\r\n" \
        "\r\n"

int main()
{
    char data[512];
    SOCKET Socket;
    int Res ;
    WSADATA wsaData;
    char * host = "www.googleapis.com";
    struct hostent *server;
    SOCKADDR_IN Socaddr;


    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {           
        return -1;
    }

    memset(data, 0, sizeof(data));
    memset(content, 0, sizeof(content));
    Socket = socket(AF_INET, SOCK_STREAM, 0);
    if (Socket == INVALID_SOCKET)
    {
        /* Problem in socket creation*/
    }
    server = gethostbyname(host);

    memset(&Socaddr, 0, sizeof(SockAddr));
    Socaddr.sin_port = htons(443);
    Socaddr.sin_family = AF_INET;
    memcpy(&Socaddr.sin_addr.s_addr, server->h_addr, server->h_length);

        Res = connect(Socket, (SOCKADDR*)(&Socaddr), sizeof(Socaddr));
    if (Res != 0)
    {
        closesocket(Socket1);
    }
    else
    {
        Res = send(Socket, constGLReq, (int)strlen(constGLReq), 0);

        if (Res == SOCKET_ERROR)/* Checking for sending failed */
        {
            closesocket(Socket1);
        }
        else if (Res <= 0)
        {
        }
        else /* Sending successfull */`enter code here`
        {


            do
            {
            Res  = recv(Socket, data, sizeof(data), 0);
            error = WSAGetLastError();

            if (strlen(data) != 0)
            {
                    if (strlen(content) == 0)
                    {
                        strcpy(content, data);
                    }
                    else
                    {
                        strcat(content, data);
                    }
            }
            memset(data, 0, sizeof(data));
        } while (Res > 0);
                }
            }
    closesocket(Socket1);
    WSACleanup();
    return 0;
}

标签: cwinsockrecv

解决方案


推荐阅读