C++实现HTTP GET请求函数(无第三方库)
{"title":"C++实现HTTP GET请求函数(无第三方库)","description":"本篇文章介绍了如何使用C++编写一个不依赖第三方库的HTTP GET请求函数,并提供了详细的代码示例。该函数通过创建套接字、解析URL、建立连接、发送请求和接收响应等步骤实现了一个简单的HTTP GET请求。","keywords":"C++, HTTP, GET, 请求, 函数, 无第三方库, 套接字, URL, 连接, 响应, 代码示例","content":"在C++中,close是一个系统调用函数,用于关闭一个文件描述符或套接字。在使用close函数之前,需要包含相应的头文件,例如unistd.h(对于Unix/Linux系统)或Winsock2.h(对于Windows系统)。如果在代码中未包含正确的头文件或者没有正确引用命名空间,就会导致close函数被识别为未定义的标识符。\n\n以下是一个使用C++编写的简单的HTTP GET请求的函数示例,不使用第三方库:\n\ncpp\n#include <iostream>\n#include <sys/socket.h>\n#include <arpa/inet.h>\n#include <unistd.h>\n\nstd::string httpGet(const std::string& url) {\n // 创建套接字\n int sock = socket(AF_INET, SOCK_STREAM, 0);\n if (sock == -1) {\n std::cerr << "Failed to create socket" << std::endl;\n return "";\n }\n\n // 解析URL\n std::string host, path;\n int port = 80;\n size_t pos = url.find("://");\n if (pos != std::string::npos) {\n pos += 3;\n size_t end = url.find('/', pos);\n if (end == std::string::npos) {\n host = url.substr(pos);\n path = "/";\n } else {\n host = url.substr(pos, end - pos);\n path = url.substr(end);\n }\n } else {\n return "";\n }\n\n // 设置服务器地址信息\n struct sockaddr_in serverAddr{};\n serverAddr.sin_family = AF_INET;\n serverAddr.sin_port = htons(port);\n if (inet_pton(AF_INET, host.c_str(), &serverAddr.sin_addr) <= 0) {\n std::cerr << "Invalid address" << std::endl;\n close(sock);\n return "";\n }\n\n // 连接服务器\n if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {\n std::cerr << "Connection failed" << std::endl;\n close(sock);\n return "";\n }\n\n // 发送HTTP GET请求\n std::string request = "GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n";\n if (send(sock, request.c_str(), request.size(), 0) < 0) {\n std::cerr << "Failed to send request" << std::endl;\n close(sock);\n return "";\n }\n\n // 接收服务器响应\n std::string response;\n char buffer[4096];\n while (true) {\n memset(buffer, 0, sizeof(buffer));\n ssize_t bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);\n if (bytesRead <= 0) {\n break;\n }\n response += buffer;\n }\n\n // 关闭套接字\n close(sock);\n\n return response;\n}\n\nint main() {\n std::string url = "http://example.com";\n std::string response = httpGet(url);\n std::cout << response << std::endl;\n\n return 0;\n}\n\n\n这个函数实现了一个简单的HTTP GET请求,通过指定URL作为参数,返回服务器的响应。在函数内部,首先创建了一个套接字,并解析URL获取主机名和路径。然后,根据主机名和端口号建立与服务器的连接。通过发送HTTP GET请求,然后循环接收服务器的响应并存储在字符串中。最后,关闭套接字并返回服务器的响应。
原文地址: https://www.cveoy.top/t/topic/pnSd 著作权归作者所有。请勿转载和采集!