|
windows
- #include <iostream>
- #include <fstream>
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib") // Link to Winsock library
- using namespace std;
- int main() {
- WSADATA wsaData;
- SOCKET sock;
- struct sockaddr_in server;
- char* server_ip = "192.168.1.100"; // 服务器 IP 地址
- int port = 8888; // 服务器端口
- char buffer[1024];
- ifstream file("path/to/your/file.txt", ios::binary | ios::ate); // 以二进制模式打开文件,定位到文件末尾
- streamsize size = file.tellg();
- file.seekg(0, ios::beg); // 将文件指针移回文件开头
- if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
- cerr << "WSAStartup failed." << endl;
- return 1;
- }
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock == INVALID_SOCKET) {
- cerr << "Socket creation failed." << endl;
- WSACleanup();
- return 1;
- }
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = inet_addr(server_ip);
- server.sin_port = htons(port);
- if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
- cerr << "Connect failed." << endl;
- closesocket(sock);
- WSACleanup();
- return 1;
- }
- cout << "Connected to the server." << endl;
- // 发送文件大小
- send(sock, reinterpret_cast<char*>(&size), sizeof(size), 0);
- if (file.is_open()) {
- while (!file.eof()) {
- file.read(buffer, sizeof(buffer));
- int bytes_read = file.gcount();
- send(sock, buffer, bytes_read, 0);
- }
- file.close();
- } else {
- cerr << "Failed to open file." << endl;
- }
- closesocket(sock);
- WSACleanup();
- return 0;
- }
複製代碼 linux:
- #include <iostream>
- #include <fstream>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <cstring> // For memset
- using namespace std;
- int main() {
- int server_fd, new_socket;
- struct sockaddr_in address;
- int opt = 1;
- int addrlen = sizeof(address);
- char buffer[1024] = {0};
- char* filename = "received_file.txt";
- ofstream file(filename, ios::binary | ios::out);
- streamsize size = 0;
- streamsize received = 0;
- // Initialize and bind socket
- if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
- cerr << "socket failed" << endl;
- return -1;
- }
- if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
- cerr << "setsockopt" << endl;
- return -1;
- }
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;
- address.sin_port = htons(8888);
- memset(&address, 0, sizeof(address));
- if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
- cerr << "bind failed" << endl;
- return -1;
- }
- if (listen(server_fd, 3) < 0) {
- cerr << "listen" << endl;
- return -1;
- }
- if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
- cerr << "accept" << endl;
- return -1;
- }
- cout << "Connection accepted." << endl;
- // Receive file size
- recv(new_socket, reinterpret_cast<char*>(&size), sizeof(size), 0);
- cout << "Receiving file of size: " << size << " bytes" << endl;
- if (file.is_open()) {
- while (received < size) {
- int bytes_read = recv(new_socket, buffer, sizeof(buffer), 0);
- if (bytes_read <= 0) {
- cerr << "recv failed or connection closed" << endl;
- break;
- }
- file.write(buffer, bytes_read);
- received += bytes_read;
- cout << "Progress: " << (received * 100.0 / size) << "%" << endl;
- }
- file.close();
- } else {
- cerr << "Failed to open file." << endl;
- }
- close(new_socket);
- close(server_fd);
- return 0;
- }
複製代碼
|
|