Secure Peer-to-Peer File Sharing C++
👤 Sharing: AI
```cpp
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <fstream>
#include <sstream>
#include <random>
#include <algorithm> // For std::remove
// Networking Libraries (Platform-dependent, using cross-platform approach)
#ifdef _WIN32
#include <winsock2.h> // Include before windows.h
#include <ws2tcpip.h> // for inet_pton and inet_ntop
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h> // For getaddrinfo
#endif
// Constants
const int PORT = 12345;
const int BUFFER_SIZE = 1024;
const int MAX_PEERS = 5; // Maximum number of peers this node will connect to
const std::string PEER_LIST_FILE = "peer_list.txt"; // File to store known peers
// Helper functions (cross-platform cleanup)
#ifdef _WIN32
void cleanupSocket(SOCKET sock) {
closesocket(sock);
}
#else
void cleanupSocket(int sock) {
close(sock);
}
#endif
// Struct to store peer information
struct PeerInfo {
std::string ipAddress;
int port;
PeerInfo(const std::string& ip, int p) : ipAddress(ip), port(p) {}
};
// --- Helper Functions ---
// Generate a random filename (simple example, improve for real use)
std::string generateRandomFilename(int length = 10) {
const std::string characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, characters.size() - 1);
std::string filename;
for (int i = 0; i < length; ++i) {
filename += characters[dis(gen)];
}
return filename + ".txt"; // Add a default extension
}
// --- Networking Functions ---
// Function to initialize Winsock on Windows
#ifdef _WIN32
bool initializeWinsock() {
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
std::cerr << "WSAStartup failed: " << result << std::endl;
return false;
}
return true;
}
#endif
// Function to listen for incoming connections
void listenForConnections() {
#ifdef _WIN32
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
#else
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
#endif
if (serverSocket == -1) {
std::cerr << "Error creating socket" << std::endl;
return;
}
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(PORT);
if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
std::cerr << "Bind failed" << std::endl;
cleanupSocket(serverSocket);
return;
}
listen(serverSocket, MAX_PEERS);
std::cout << "Listening on port " << PORT << std::endl;
while (true) {
#ifdef _WIN32
SOCKET clientSocket = accept(serverSocket, NULL, NULL);
#else
int clientSocket = accept(serverSocket, NULL, NULL);
#endif
if (clientSocket < 0) {
std::cerr << "Accept failed" << std::endl;
continue;
}
std::cout << "Connection accepted" << std::endl;
std::thread clientThread(handleClient, clientSocket);
clientThread.detach(); // Detach the thread so it can run independently
}
cleanupSocket(serverSocket);
}
// Function to handle a client connection
void handleClient(int clientSocket) {
char buffer[BUFFER_SIZE];
int bytesReceived;
while ((bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE - 1, 0)) > 0) {
buffer[bytesReceived] = '