#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void send_request(const std::string& server, const std::string& path) {
WSADATA wsa;
SOCKET s;
struct sockaddr_in server_addr;
struct hostent* he;
std::string request;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
std::cerr << "Ошибка инициализации Winsock\n";
return;
}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
std::cerr << "Ошибка создания сокета\n";
WSACleanup();
return;
}
if ((he = gethostbyname(server.c_str())) == nullptr) {
std::cerr << "Ошибка получения IP-адреса сервера\n";
closesocket(s);
WSACleanup();
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr.s_addr = *((unsigned long*)he->h_addr);
if (connect(s, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
std::cerr << "Ошибка подключения\n";
closesocket(s);
WSACleanup();
return;
}
request = "GET " + path + " HTTP/1.1\r\n";
request += "Host: " + server + "\r\n";
request += "Connection: close\r\n";
request += "\r\n";
if (send(s, request.c_str(), request.length(), 0) == SOCKET_ERROR) {
std::cerr << "Ошибка при отправке запроса\n";
closesocket(s);
WSACleanup();
return;
}
char response[4096];
int response_length;
while ((response_length = recv(s, response, sizeof(response) - 1, 0)) > 0) {
response[response_length] = '\0';
std::cout << response;
}
if (response_length == SOCKET_ERROR) {
std::cerr << "Ошибка при получении ответа\n";
}
closesocket(s);
WSACleanup();
}
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cerr << "Использование: " << argv[0] << " <URL>\n";
return 1;
}
std::string url = argv[1];
std::string prefix = "http://";
size_t pos = url.find(prefix);
if (pos == std::string::npos) {
std::cerr << "Некорректный URL (должен начинаться с http://)\n";
return 1;
}
std::string server = url.substr(prefix.length(), url.find('/', prefix.length()) - prefix.length());
std::string path = url.substr(url.find(server) + server.length());
if (path.empty()) path = "/";
send_request(server, path);
return 0;
}