Member 14062266 Ответов: 0

Recv() всегда возвращает 0 при попытке отправить HTTP POST запрос 0


I am trying to use HTTP post request to get the location info from google geolocation API but something is going wrong with the connection after I send the query i get 0 as return value for recev()  Is the way am sending post request the issue?  why does the connection close after I send the request? what should i do to keep the connection alive?


Что я уже пробовал:

#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;
}

Richard MacCutchan

Что происходит, когда вы вводите этот URL-адрес в браузер?

Member 14062266

если вы дадите непосредственно браузеру, он выдаст ошибку not found, но я получил необходимую информацию, когда использовал url-адрес в приложении postman.

Richard MacCutchan

Тогда это говорит о том, что проблема находится в конце Google, а не с вашим кодом.

Richard Deeming

Надеюсь, это не твоя вина. реальный" Ключ API, который вы только что опубликовали на публичном форуме?

Если это так, вы должны немедленно отозвать его и получить новый.

0 Ответов