Программа Sockets_Receive
Я реализовал код, необходимый для воссоздания этапов, изображенных на рис. 14.10. Загрузите программу Sockets_Receive и следуйте за мной. Проект состоит из файла main.cpp и единственной библиотеки ws2_32.lib, которая содержит все, что необходимо для программирования сокетов в Windows. Скомпилируйте программу и запустите ее. Вы увидите окно консольного приложения, в котором отображается содержимое главной страницы сайта, имя которого задано в коде. Как это должно выглядеть, показано на рис. 14.11.
Рис. 14.11. Окно программы Sockets_Receive
Открыв файл main.cpp вы увидите следующий код:
#include <iostream.h> #include <winsock.h> #include <stdio.h>
void main(void) { SOCKET skSocket; sockaddr_in saServerAddress; int iPort = 80; int iStatus; WSADATA wsaData; WORD wVersionRequested; LPHOSTENT lpHost; char szHost[128]; char szSendBuffer[256]; char szRecvBuffer[32768]; int iBytesSent; int iBytesReceived;
sprintf(szHost,"www.lostlogic.com"); // Сообщаем WinSock, что нам нужна версия 2 wVersionRequested = MAKEWORD(2, 0); // Инициализируем дескриптор сокета skSocket = INVALID_SOCKET; // Запускаем WinSock iStatus = WSAStartup(wVersionRequested, &wsaData); // Создаем сокет skSocket = socket(AF_INET, SOCK_STREAM, 0); // Проверяем наличие ошибок if(skSocket == INVALID_SOCKET) { cout << "**ERROR** Could Not Create Socket" << endl; exit(1); } memset(&saServerAddress, 0, sizeof(sockaddr_in)); saServerAddress.sin_family = AF_INET; saServerAddress.sin_addr.s_addr = inet_addr(szHost);
if(saServerAddress.sin_addr.s_addr == INADDR_NONE) { lpHost = gethostbyname(szHost); if (lpHost != NULL) { // Получаем адрес сервера из информации хоста saServerAddress.sin_addr.s_addr = ((LPIN_ADDR)lpHost->h_addr)->s_addr; } else { cout << "**ERROR** Could Not Locate Host" << endl; exit(1); } } // Задаем порт сервера saServerAddress.sin_port = htons(iPort); // Пытаемся подключиться к серверу iStatus = connect(skSocket, (struct sockaddr*)&saServerAddress, sizeof(sockaddr));
// Проверяем наличие ошибок if(iStatus == SOCKET_ERROR) { cout << "**ERROR** Could Not Connect To Server" << endl; exit(1); } sprintf(szSendBuffer,"GET / HTTP/1.0\n\n"); // Отправляем HTTP-запрос iBytesSent = send(skSocket, szSendBuffer, 256, 0); memset(szRecvBuffer, 0x00, 32768); // Получаем данные iBytesReceived = recv(skSocket, szRecvBuffer, 32768, 0); cout << szRecvBuffer << endl; // Завершаем работу closesocket(skSocket); WSACleanup(); }