chatgpt winhttp

复制代码
下面是一个使用 WinHTTP 发送文件,然后使用 evpp 接收文件的简单示例代码。请注意,这只是一个基本示例,并没有处理文件大小超过 100MB 的特殊情况。

发送端(WinHTTP):

cpp
|
#include <windows.h>
#include <winhttp.h>
#include <iostream>

#pragma comment(lib, "winhttp.lib")

int main() {
    HINTERNET hSession = NULL;
    HINTERNET hConnect = NULL;
    DWORD bytesRead = 0;
    
    const char* filePath = "path/to/file.txt";
    const char* serverUrl = "http://localhost:8080/upload"; // 上传文件的地址
    
    hSession = WinHttpOpen(L"WinHTTP Example/1.0", 
                           WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 
                           WINHTTP_NO_PROXY_NAME, 
                           WINHTTP_NO_PROXY_BYPASS, 
                           0);
    if (!hSession) {
        std::cout << "Failed to open WinHTTP session" << std::endl;
        return -1;
    }
    
    hConnect = WinHttpOpenRequest(hSession, 
                                 L"POST", 
                                 serverUrl, 
                                 NULL, 
                                 WINHTTP_NO_REFERER, 
                                 WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                 0);
    if (!hConnect) {
        std::cout << "Failed to open WinHTTP request" << std::endl;
        WinHttpCloseHandle(hSession);
        return -1;
    }
    
    if (WinHttpSendRequest(hConnect, 
                           L"Content-Type: application/octet-stream", 
                           -1, 
                           WINHTTP_NO_REQUEST_DATA, 
                           0, 
                           strlen(filePath), 
                           0) == FALSE) {
        std::cout << "Failed to send WinHTTP request" << std::endl;
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return -1;
    }
    
    std::ifstream file(filePath, std::ios::binary);
    if (!file) {
        std::cout << "Failed to open file for reading" << std::endl;
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return -1;
    }
    
    DWORD totalBytesWritten = 0;
    constexpr DWORD bufferSize = 8192; // 缓冲区大小
    char buffer[bufferSize];
    
    while (file.read(buffer, bufferSize)) {
        if (!WinHttpWriteData(hConnect, buffer, bufferSize, &bytesRead)) {
            std::cout << "Failed to write data using WinHTTP" << std::endl;
            file.close();
            WinHttpCloseHandle(hConnect);
            WinHttpCloseHandle(hSession);
            return -1;
        }
        
        totalBytesWritten += bytesRead;
    }
    
    DWORD remainingBytes = file.gcount();
    if (remainingBytes > 0 && !WinHttpWriteData(hConnect, buffer, remainingBytes, &bytesRead)) {
        std::cout << "Failed to write remaining data using WinHTTP" << std::endl;
        file.close();
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return -1;
    }
    
    totalBytesWritten += bytesRead;
    file.close();
    
    std::cout << "Total bytes written: " << totalBytesWritten << std::endl;
    
    if (!WinHttpReceiveResponse(hConnect, NULL)) {
        std::cout << "Failed to receive response using WinHTTP" << std::endl;
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hSession);
        return -1;
    }
    
    // 处理服务器响应
    // ...
    
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
    
    return 0;
}
接收端(evpp):

cpp
|
#include <evpp/http/http_server.h>
#include <iostream>

void DefaultHandler(const evpp::http::RequsetPtr& req, evpp::http::ResponseWriter& writer) {
    std::cout << "Received request" << std::endl;
    
    // 保存接收到的文件数据
    // ...
    
    writer.SendReply(evpp::http::StatusCode::kOK, "OK");
}

int main() {
    evpp::http::Server server;
    server.RegisterHandler("/upload", DefaultHandler);
    
    std::string ip = "0.0.0.0";
    uint16_t port = 8080;
    
    if (server.Init(ip, port)) {
        server.Start();
        std::cout << "Listening on " << ip << ":" << port << std::endl;
    } else {
        std::cerr << "Failed to start server" << std::endl;
        return -1;
    }
    
    server.Stop();
    
    return 0;
}
上述代码使用 WinHTTP 在发送端将文件发送到 evpp HTTP 服务器的指定路径。接收端在接收到文件后,可以在 DefaultHandler 函数中实现具体的逻辑,例如保存文件数据。别忘了替换 serverUrl 和 filePath 为实际的地址和文件路径。

此示例代码仅提供了基本的架构和概念,实际中还需要处理错误、协议解析、完整性校验等问题。请根据实际需求进行适当修改和扩展。
复制代码

 

posted on   lydstory  阅读(9)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-07-27 古人怜
2020-07-27 struct dirent DT_REG
2020-07-27 layui
2020-07-27 cd desktop
2020-07-27 java队列 任务 多线程
2019-07-27 态势感知
2019-07-27 EDR

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示