|
VC++ 多线程读取多个文件并上传到服务器的示例代码
一个使用 VC++ 多线程读取多个文件并上传到服务器的示例代码。我们将使用 C++ 的线程库来实现多线程,并使用 WinSock 库进行网络上传。
### 步骤概述
1. **打开多个文件**:使用文件流打开需要上传的多个文件。
2. **多线程处理**:为每个文件启动一个线程,负责读取文件并上传。
3. **上传到服务器**:每个线程读取完文件后,将数据上传到服务器。
- ### 示例代码
- #include <iostream>
- #include <fstream>
- #include <thread>
- #include <vector>
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib")
- // 定义上传函数
- void uploadFile(const std::string& filePath, const std::string& serverIP, int port) {
- // 创建套接字
- SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock == INVALID_SOCKET) {
- std::cerr << "Socket creation failed!" << std::endl;
- return;
- }
- // 设置服务器地址
- sockaddr_in serverAddr;
- serverAddr.sin_family = AF_INET;
- serverAddr.sin_port = htons(port);
- inet_pton(AF_INET, serverIP.c_str(), &serverAddr.sin_addr);
- // 连接到服务器
- if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
- std::cerr << "Connection to server failed!" << std::endl;
- closesocket(sock);
- return;
- }
- // 打开文件
- std::ifstream file(filePath, std::ios::binary);
- if (!file) {
- std::cerr << "Failed to open file: " << filePath << std::endl;
- closesocket(sock);
- return;
- }
- // 读取文件内容并上传
- std::vector<char> buffer((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
- send(sock, buffer.data(), buffer.size(), 0);
- // 关闭套接字
- closesocket(sock);
- std::cout << "File uploaded: " << filePath << std::endl;
- }
- // 多线程读取多个文件并上传
- int main() {
- const std::string serverIP = "127.0.0.1"; // 服务器IP
- const int port = 8080; // 服务器端口
- // 要上传的文件列表
- std::vector<std::string> filesToUpload = {
- "path/to/your/file1.txt",
- "path/to/your/file2.txt",
- "path/to/your/file3.txt"
- };
- // 启动多个线程读取文件并上传
- std::vector<std::thread> threads;
- for (const auto& filePath : filesToUpload) {
- threads.emplace_back(uploadFile, filePath, serverIP, port);
- }
- // 等待所有线程完成
- for (auto& t : threads) {
- t.join();
- }
- std::cout << "All files have been uploaded!" << std::endl;
- return 0;
- }
复制代码
### 代码说明
1. **uploadFile**:该函数负责打开指定文件,读取文件内容并上传到指定的服务器。
2. **main**:在主函数中,定义要上传的文件列表,并为每个文件启动一个线程,调用 `uploadFile` 函数进行上传。
3. **多线程处理**:使用 `std::thread` 来处理每个文件的上传,确保能够同时处理多个文件。
### 注意事项
- 确保在使用 WinSock 之前调用 `WSAStartup` ,并在程序结束时调用 `WSACleanup` 。
- 处理网络错误和异常情况,以确保程序的健壮性。
- 根据实际需求调整要上传的文件列表和服务器信息。
这个示例提供了一个基本的多线程文件上传的实现,你可以根据具体需求进行扩展和优化。
|
|