Я новичок в использовании Winsock, и чтобы посмотреть, что он может сделать, я сделал быстрый HTTP-клиент (не совсем), который просто запрашивал индексную страницу веб-сайта. Однако при попытке прочитать данные, полученные с сервера, это не то, что я ожидал. Вот пример вывода:
ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̤÷
Это происходит при попытке подключения к любому веб-сайту, и я получаю это от попытки вывести содержимое recvbuf, где предполагается хранить полученные данные. Это то, как данные обычно возвращаются из winsock? Кроме того, я не думаю, что это мой код, потому что я не получаю никаких ошибок. Я почти уверен, что это нормально, и я просто пропустил шаг, но поиск ничего не дал, поэтому я спрашиваю здесь.
РЕДАКТИРОВАТЬ: Извините, не могу поверить, что забыл свой код:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
addrinfo *result, *ptr, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
iResult = getaddrinfo("google.com", "80", &hints, &result);
if (iResult != 0) {
cout << "Error in getaddrinfo()!\n";
cin.get();
return 1;
} else {
cout << "Success!\n";
}
SOCKET ConnectSocket = INVALID_SOCKET;
ptr = result;
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
iResult = connect(ConnectSocket, ptr->ai_addr, int(ptr->ai_addrlen));
freeaddrinfo(result);
int recvbuflen = 512;
char *sendbuf = "GET / http/1.1";
char recvbuf[512];
send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
shutdown(ConnectSocket, SD_SEND);
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
cout << recvbuf << endl;
} while (iResult > 0);
cin.get();
return 0;
}
recv
. - person Captain Obvlious   schedule 01.06.2014char *sendbuf = "GET / HTTP/1.1\r\n\r\n";
. Обратите внимание на использование заглавных букв в слове HTTP и обязательные конечные пары CRLF. - person Retired Ninja   schedule 01.06.2014Host
, он требуется для HTTP 1.1. - person Remy Lebeau   schedule 01.06.2014