Untitled
unknown
plain_text
a month ago
4.3 kB
2
Indexable
#include <iostream> #include <map> #include <vector> #include <string> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <thread> #define PORT 4444 #define BUFFER_SIZE 1024 using namespace std; static map<string, vector<string>> fileDatabase; // Function to send IP addresses of peers with the requested file void sendIPAddress(int clientSocket, const string &filename) { using namespace std; if (fileDatabase.find(filename) == fileDatabase.end()) { string errorMsg = "File not found"; send(clientSocket, errorMsg.c_str(), errorMsg.size(), 0); cerr << "Error: File not found - " << filename << "\n"; return; } char buffer[BUFFER_SIZE]; string fileIPAddresses = ""; for (auto &k : fileDatabase[filename]) { fileIPAddresses += k + ' '; } strcpy(buffer, fileIPAddresses.c_str()); send(clientSocket, buffer, sizeof(buffer), 0); cout << "IP address sent successfully: " << filename << "\n"; } // Function to handle communication with a client void handleClient(int clientSocket) { using namespace std; char buffer[BUFFER_SIZE] = {0}; while (true) { memset(buffer, 0, BUFFER_SIZE); // Clear buffer before reading int bytesRead = read(clientSocket, buffer, BUFFER_SIZE); if (bytesRead <= 0) { // Client disconnected or error occurred close(clientSocket); return; } string command(buffer); if (command == "exit") { cout << "Client disconnected.\n"; close(clientSocket); return; } if (command.rfind("Send ", 0) == 0) { // Command starts with "Send" string filename = command.substr(5); // Extract filename sendIPAddress(clientSocket, filename); } } } // Function to handle client connections in a separate thread void handleClientConnection(int clientSocket) { handleClient(clientSocket); } int main() { using namespace std; int serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { cerr << "Failed to create socket.\n"; return -1; } sockaddr_in serverAddr{}; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { cerr << "Failed to bind socket.\n"; close(serverSocket); return -1; } if (listen(serverSocket, 5) == -1) { cerr << "Failed to listen on socket.\n"; close(serverSocket); return -1; } cout << "Server is listening on port " << PORT << "...\n"; while (true) { sockaddr_in clientAddr{}; socklen_t clientLen = sizeof(clientAddr); int clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientLen); if (clientSocket == -1) { cerr << "Failed to accept connection.\n"; continue; } char buffer[2048] = {0}; read(clientSocket, buffer, sizeof(buffer)); string filesJson = string(buffer); std::string::size_type start = 0; std::string::size_type end = 0; while ((end = filesJson.find(':', start)) != std::string::npos) { string file = filesJson.substr(start, end - start); start = end + 1; std::string::size_type fileNameIndex = file.find(' ', 0); fileDatabase[file.substr(0, fileNameIndex)].push_back(file.substr(fileNameIndex + 1)); } for (auto &k : fileDatabase) { for (auto &m : k.second) { cout << k.first << ' ' << m << endl; } } cout << "Client connected.\n"; // Create a new thread to handle the client connection thread clientThread(handleClientConnection, clientSocket); clientThread.detach(); } close(serverSocket); return 0; }
Editor is loading...
Leave a Comment