如何在C++中直接读取在线Raw Pastebin文件内容(无额外依赖)
直接在C++中读取在线Raw Pastebin内容(无额外依赖)
没问题!想要在C里直接读取在线Raw Pastebin的内容,又不想依赖第三方库,完全可以借助系统自带的网络API来实现——毕竟C标准库本身没提供网络操作的模块。下面我分Windows和Linux两个平台给你写针对性的实现,都是只依赖系统库的方案:
Windows 平台(用WinINet API)
WinINet是Windows系统自带的网络工具库,不用额外安装任何东西,只要编译时链接wininet.lib就行。因为你说目标文件只有一行文本,咱们可以读到换行就停,省点资源:
#include <windows.h> #include <wininet.h> #include <iostream> #include <string> #pragma comment(lib, "wininet.lib") int main() { // 初始化WinINet环境 HINTERNET hInternet = InternetOpenA("RawPastebinReader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (!hInternet) { std::cerr << "初始化网络环境失败,错误码:" << GetLastError() << std::endl; return 1; } // 打开目标Raw Pastebin地址 HINTERNET hUrl = InternetOpenUrlA(hInternet, "pastebin.com/raw/k1XLUS00", NULL, 0, INTERNET_FLAG_RELOAD, 0); if (!hUrl) { std::cerr << "打开URL失败,错误码:" << GetLastError() << std::endl; InternetCloseHandle(hInternet); return 1; } // 逐字符读取内容,直到换行或结束 char buffer[2]; std::string content; DWORD bytesRead; while (InternetReadFile(hUrl, buffer, 1, &bytesRead) && bytesRead > 0) { if (buffer[0] == '\n') break; // 读到换行就停止,符合你说的单行文本场景 content += buffer[0]; } // 输出读取到的内容 std::cout << "读取到的内容:\n" << content << std::endl; // 别忘了清理资源 InternetCloseHandle(hUrl); InternetCloseHandle(hInternet); return 0; }
编译的时候,用MSVC的话记得链接wininet.lib,比如命令行加/link wininet.lib,或者在IDE里把这个库加到依赖里。
Linux 平台(用原生Socket API)
Linux下直接用BSD Socket接口就行,这是内核自带的,不需要装任何额外库。同样针对单行文本做了优化:
#include <iostream> #include <string> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <unistd.h> #include <cstring> int main() { // 创建Socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { std::cerr << "创建Socket失败" << std::endl; return 1; } // 解析pastebin的主机地址 struct hostent* server = gethostbyname("pastebin.com"); if (!server) { std::cerr << "无法解析pastebin主机地址" << std::endl; close(sockfd); return 1; } // 设置服务器地址结构体 struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length); serv_addr.sin_port = htons(80); // HTTP默认端口是80 // 连接到pastebin服务器 if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { std::cerr << "连接pastebin服务器失败" << std::endl; close(sockfd); return 1; } // 发送HTTP GET请求,要符合HTTP规范 const char* request = "GET /raw/k1XLUS00 HTTP/1.1\r\nHost: pastebin.com\r\nConnection: close\r\n\r\n"; ssize_t bytesSent = send(sockfd, request, strlen(request), 0); if (bytesSent < 0) { std::cerr << "发送GET请求失败" << std::endl; close(sockfd); return 1; } // 读取响应:先跳过HTTP头,再读取正文(单行就停) char buffer[1024]; std::string content; bool headerEnded = false; ssize_t bytesRead; while ((bytesRead = read(sockfd, buffer, sizeof(buffer)-1)) > 0) { buffer[bytesRead] = '\0'; if (!headerEnded) { // 找HTTP头结束的标志:两个连续的换行(\r\n\r\n) std::string temp(buffer); size_t headerPos = temp.find("\r\n\r\n"); if (headerPos != std::string::npos) { headerEnded = true; // 提取头之后的正文内容 content += temp.substr(headerPos + 4); // 检查有没有换行,有的话截断到换行前 size_t newlinePos = content.find('\n'); if (newlinePos != std::string::npos) { content = content.substr(0, newlinePos); break; } } } else { // 已经读到正文了,找换行就停 std::string temp(buffer); size_t newlinePos = temp.find('\n'); if (newlinePos != std::string::npos) { content += temp.substr(0, newlinePos); break; } else { content += temp; } } } // 输出结果 std::cout << "读取到的内容:\n" << content << std::endl; // 关闭Socket close(sockfd); return 0; }
编译直接用g++就行:g++ -o pastebin_reader pastebin_reader.cpp,不用加额外的链接参数。
小补充
- 这两个方案都是完全无第三方依赖的,只用了系统自带的库;
- 因为你的目标文件只有一行,所以代码里都做了优化,读到换行就停止读取,不用读多余的内容;
- 如果以后要处理HTTPS地址的话,Windows可以改用WinHTTP,Linux可以用OpenSSL,但那样就需要链接额外库了——不过你现在的地址是HTTP的,上面的代码完全够用。
内容的提问来源于stack exchange,提问作者Jon Donkel
相关产品推荐
相关产品推荐

