#include "net.h" #include "error.h" #include #include #include #include #include #include #include void WaitForOrdersFromClient(const ClientInfo info, CTTRTSGame &game, std::mutex &mut) { char buffer[1028]; // buffer for orders std::clog<<"TTRTS: Waiting for player "<<(int)info.player<<" at "< &myClients, CTTRTSGame &game, std::mutex &gameMutex) { // Spawn threads std::vector clientThreads; for(auto client : myClients) { std::thread clientThread(WaitForOrdersFromClient, client, std::ref(game), ref(gameMutex)); clientThreads.push_back(move(clientThread)); } // Join up all the threads for ( std::thread& thread : clientThreads ) { thread.join(); } } void SendGamestateToClients(std::vector &myClients, const CTTRTSGame &game, std::mutex &gameMutex) { gameMutex.lock(); std::string gamestate_string = GetStringFromGame(game); gameMutex.unlock(); for (auto client : myClients) { // Write to the socket with the buffer if ( write( client.clientsockfd, gamestate_string.c_str(), gamestate_string.length() ) < 0 ) fatal_perror("ERROR sending to client"); } } void PerformClientHandshake(int sockfd, unsigned int &player, std::string &gameNameString) { char handshakeBuffer[128]; memset(handshakeBuffer,0,sizeof(handshakeBuffer)); if (read(sockfd, handshakeBuffer,sizeof(handshakeBuffer)-1) < 0) fatal_perror("ERROR recieving handshake from server"); std::string handshake(handshakeBuffer); if ( write( sockfd, handshake.c_str(), handshake.length()+1 ) < 0 ) fatal_perror("ERROR sending handshake to server"); char gameName[64]; if ( sscanf(handshake.c_str(),TTRTS_HANDSHAKE_FORMAT,&player,gameName) < 2 ) fatal_error("Handshake failed"); gameNameString = gameName; } void PerformServerHandshake(const ClientInfo &client, const std::string &game) { char handshake[64]; snprintf(handshake, sizeof(handshake), TTRTS_HANDSHAKE_FORMAT,(unsigned int)client.player,game.c_str()); // Send handshake if ( write( client.clientsockfd,handshake,sizeof(handshake) ) < 0 ) fatal_perror("ERROR sending to client"); // Receive handshake char buffer[64]; if ( read(client.clientsockfd,buffer,sizeof(buffer)-1) < 0 ) fatal_perror("ERROR reading from client"); // Verify handshake if ( std::string(buffer) != std::string(handshake) ) fatal_error("Error in client handshake"); std::clog<<"TTRTS: Success on handshake with player "<<(int)client.player<< std::endl; } void TryBindSocket(int sockfd, const sockaddr_in &serv_addr) { std::clog<<"TTRTS: Binding to socket"<< std::endl; int retry = 1; while (1) { if(retry > 10) fatal_error("Binding failed"); // Attempt to bind our listening socket if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) >= 0) break; std::cerr<<"Warning: Binding failed on try "<h_addr, server->h_length); // Attempt to connect to the server using the socket and server address info if (connect(sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) fatal_perror("ERROR connecting"); return sockfd; } std::string WaitForGamestateMessage(int sockfd) { std::string gamestate; char gamestateBuffer[1028]; while( gamestate.find("END") == std::string::npos ) { memset(gamestateBuffer,0,sizeof(gamestateBuffer)); // Receive gamestate if (read(sockfd,gamestateBuffer,sizeof(gamestateBuffer)-1) < 0) fatal_perror("ERROR reading from client"); gamestate+=gamestateBuffer; } return gamestate; } int SendOrdersToServer(int sockfd, const std::string &orders) { int n = write(sockfd,orders.c_str(),orders.length()); if (n < 0) fatal_perror("ERROR writing to socket"); return n; } int OutputGameEnd( CTTRTSGame& game ) { std::cout<<"TTRTS: Game Over!"<