Прежде чем пометить этот пост как дубликат: я перепробовал все «решения», которые я мог найти в Интернете и в стеке, но у меня ничего не получалось, в основном потому, что некоторые функции устарели, или мне не хватало некоторых библиотек или чего-то еще.
Я получил следующий код Вот (второй ответ, потому что я не мог заставить 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 […])
и это совершенно логично для меня, но я понятия не имею, как это сделать правильно, поэтому, если кто-то и делает, пожалуйста, скажите мне, почему я сейчас немного подавлен.
Одна очевидная ошибка заключается в том, что ваш внутренний цикл while бесконечен.
Вы должны ограничить его, используя i
а также nDataLength
переменные.