HTTP POST запрос с C++

Прежде чем пометить этот пост как дубликат: я перепробовал все "решения", которые я мог найти в Интернете и в стеке, но у меня ничего не получалось, в основном из-за того, что некоторые функции устарели, или мне не хватало некоторых библиотек или чего-то еще.

Я получил следующий код здесь (второй ответ, потому что я не мог заставить libcurl работать), но это не работает для меня, потому что Visual Studio 2015 говорит мне использовать GetAddrInfoW() вместо gethostbyname() потому что это устарело, поэтому я попытался сделать это и в итоге так:

WSADATA wsaData;

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


SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent* host = new hostent();
GetAddrInfoW((PCWSTR)"www.google.com", (PCWSTR)"http", nullptr, (PADDRINFOW*)host);
SOCKADDR_IN SockAddr;
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)"192.168.xxx.xxx");

if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0)
{
    return;
}

send(Socket, "GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"), 0);
char buffer[10000];
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0)
{
    int i = 0;
    while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r')
    {
        i += 1;
    }
}
closesocket(Socket);
WSACleanup();

Это не будет работать ни из-за нулевого указателя

(Visual Studio сообщает: исключение сработало в 0x00AE5F02 в Project1.exe: 0xC0000005: чтение нарушения доступа в позиции 0x00000000 [...])

и это совершенно логично для меня, но я понятия не имею, как это сделать правильно, поэтому, если кто-то и делает, пожалуйста, скажите мне, почему я сейчас немного подавлен.

1 ответ

Одна очевидная ошибка заключается в том, что ваш внутренний цикл while бесконечен. Вы должны ограничить его, используя i а также nDataLength переменные.

Другие вопросы по тегам