登錄 |創建賬號 |找回密碼
查看: 67|回復: 0

windows上传文件至linux

[複製鏈接]

23

主題

6

回帖

128

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
128
發表於 2024-3-23 22:45:01 | 顯示全部樓層 |閱讀模式
windows

  1. #include <iostream>
  2. #include <fstream>
  3. #include <winsock2.h>
  4. #pragma comment(lib, "ws2_32.lib") // Link to Winsock library

  5. using namespace std;

  6. int main() {
  7.     WSADATA wsaData;
  8.     SOCKET sock;
  9.     struct sockaddr_in server;
  10.     char* server_ip = "192.168.1.100"; // 服务器 IP 地址
  11.     int port = 8888; // 服务器端口
  12.     char buffer[1024];
  13.     ifstream file("path/to/your/file.txt", ios::binary | ios::ate); // 以二进制模式打开文件,定位到文件末尾

  14.     streamsize size = file.tellg();
  15.     file.seekg(0, ios::beg); // 将文件指针移回文件开头

  16.     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
  17.         cerr << "WSAStartup failed." << endl;
  18.         return 1;
  19.     }

  20.     sock = socket(AF_INET, SOCK_STREAM, 0);
  21.     if (sock == INVALID_SOCKET) {
  22.         cerr << "Socket creation failed." << endl;
  23.         WSACleanup();
  24.         return 1;
  25.     }

  26.     server.sin_family = AF_INET;
  27.     server.sin_addr.s_addr = inet_addr(server_ip);
  28.     server.sin_port = htons(port);

  29.     if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
  30.         cerr << "Connect failed." << endl;
  31.         closesocket(sock);
  32.         WSACleanup();
  33.         return 1;
  34.     }

  35.     cout << "Connected to the server." << endl;

  36.     // 发送文件大小
  37.     send(sock, reinterpret_cast<char*>(&size), sizeof(size), 0);

  38.     if (file.is_open()) {
  39.         while (!file.eof()) {
  40.             file.read(buffer, sizeof(buffer));
  41.             int bytes_read = file.gcount();
  42.             send(sock, buffer, bytes_read, 0);
  43.         }
  44.         file.close();
  45.     } else {
  46.         cerr << "Failed to open file." << endl;
  47.     }

  48.     closesocket(sock);
  49.     WSACleanup();
  50.     return 0;
  51. }
複製代碼
linux:
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <unistd.h>
  6. #include <cstring> // For memset

  7. using namespace std;

  8. int main() {
  9.     int server_fd, new_socket;
  10.     struct sockaddr_in address;
  11.     int opt = 1;
  12.     int addrlen = sizeof(address);
  13.     char buffer[1024] = {0};
  14.     char* filename = "received_file.txt";
  15.     ofstream file(filename, ios::binary | ios::out);
  16.     streamsize size = 0;
  17.     streamsize received = 0;

  18.     // Initialize and bind socket
  19.     if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  20.         cerr << "socket failed" << endl;
  21.         return -1;
  22.     }
  23.     if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
  24.         cerr << "setsockopt" << endl;
  25.         return -1;
  26.     }
  27.     address.sin_family = AF_INET;
  28.     address.sin_addr.s_addr = INADDR_ANY;
  29.     address.sin_port = htons(8888);
  30.     memset(&address, 0, sizeof(address));
  31.     if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
  32.         cerr << "bind failed" << endl;
  33.         return -1;
  34.     }
  35.     if (listen(server_fd, 3) < 0) {
  36.         cerr << "listen" << endl;
  37.         return -1;
  38.     }
  39.     if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
  40.         cerr << "accept" << endl;
  41.         return -1;
  42.     }

  43.     cout << "Connection accepted." << endl;

  44.     // Receive file size
  45.     recv(new_socket, reinterpret_cast<char*>(&size), sizeof(size), 0);
  46.     cout << "Receiving file of size: " << size << " bytes" << endl;

  47.     if (file.is_open()) {
  48.         while (received < size) {
  49.             int bytes_read = recv(new_socket, buffer, sizeof(buffer), 0);
  50.             if (bytes_read <= 0) {
  51.                 cerr << "recv failed or connection closed" << endl;
  52.                 break;
  53.             }
  54.             file.write(buffer, bytes_read);
  55.             received += bytes_read;
  56.             cout << "Progress: " << (received * 100.0 / size) << "%" << endl;
  57.         }
  58.         file.close();
  59.     } else {
  60.         cerr << "Failed to open file." << endl;
  61.     }

  62.     close(new_socket);
  63.     close(server_fd);
  64.     return 0;
  65. }
複製代碼


回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 創建賬號

本版積分規則

Archiver|手機版|小黑屋|九派社區 ( 苏ICP备07501547号-12 )

GMT+8, 2024-5-17 09:15 , Processed in 0.077263 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表