Make client and server perform a handshake to agree on player IDs
This commit is contained in:
parent
bccd043d2c
commit
770502184c
2 changed files with 67 additions and 1 deletions
|
@ -14,9 +14,12 @@
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
#include "game.h"
|
||||||
|
|
||||||
int runClient(int argc, char* argv[])
|
int runClient(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
player_t myPlayer;
|
||||||
|
|
||||||
int sockfd; // socket File descriptor
|
int sockfd; // socket File descriptor
|
||||||
int portno; // Port number
|
int portno; // Port number
|
||||||
int n = 0; // return value for read and write calls
|
int n = 0; // return value for read and write calls
|
||||||
|
@ -71,6 +74,30 @@ int runClient(int argc, char* argv[])
|
||||||
if (connect(sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
|
if (connect(sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
|
||||||
error("ERROR connecting");
|
error("ERROR connecting");
|
||||||
|
|
||||||
|
std::cout<<"Waiting for handshake"<<std::endl;
|
||||||
|
|
||||||
|
memset(buffer,0,sizeof(buffer));
|
||||||
|
if (read(sockfd,buffer,sizeof(buffer)-1) < 0)
|
||||||
|
error("ERROR recieving handshake from server");
|
||||||
|
|
||||||
|
std::string handshake(buffer);
|
||||||
|
|
||||||
|
if ( write(sockfd,handshake.c_str(),handshake.length()) < 0)
|
||||||
|
error("ERROR sending handshake to server");
|
||||||
|
|
||||||
|
size_t pos;
|
||||||
|
if( (pos = handshake.find("player")) != std::string::npos )
|
||||||
|
{
|
||||||
|
std::string player = handshake.substr(pos, handshake.length());
|
||||||
|
myPlayer = (player_t)atoi(player.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error("Handshake failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout<<"I am player "<< std::to_string((int)myPlayer) << std::endl;
|
||||||
|
|
||||||
while ( n >= 0 )
|
while ( n >= 0 )
|
||||||
{
|
{
|
||||||
memset(buffer,0,sizeof(buffer));
|
memset(buffer,0,sizeof(buffer));
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct ClientInfo
|
||||||
{
|
{
|
||||||
sockaddr_in cli_addr;
|
sockaddr_in cli_addr;
|
||||||
int clientsockfd;
|
int clientsockfd;
|
||||||
|
player_t player;
|
||||||
};
|
};
|
||||||
|
|
||||||
int WaitForOrdersFromClient(const ClientInfo info, std::mutex &mut, CTTRTSGame &game)
|
int WaitForOrdersFromClient(const ClientInfo info, std::mutex &mut, CTTRTSGame &game)
|
||||||
|
@ -45,7 +46,7 @@ int WaitForOrdersFromClient(const ClientInfo info, std::mutex &mut, CTTRTSGame &
|
||||||
std::cout<<buffer<<std::endl;
|
std::cout<<buffer<<std::endl;
|
||||||
|
|
||||||
mut.lock();
|
mut.lock();
|
||||||
game.IssueOrders(player_t::Red , buffer);
|
game.IssueOrders(info.player , buffer);
|
||||||
mut.unlock();
|
mut.unlock();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -135,7 +136,10 @@ int runServer(int argc, char* argv[])
|
||||||
|
|
||||||
// Set up game
|
// Set up game
|
||||||
CTTRTSGame game = GetGameFromFile("Tiny2Player.txt");
|
CTTRTSGame game = GetGameFromFile("Tiny2Player.txt");
|
||||||
|
|
||||||
|
std::vector<player_t> players = game.GetPlayers();
|
||||||
unsigned int numClients = game.GetPlayers().size();
|
unsigned int numClients = game.GetPlayers().size();
|
||||||
|
auto player_iterator = players.begin();
|
||||||
|
|
||||||
// game mutex
|
// game mutex
|
||||||
std::mutex gameMutex;
|
std::mutex gameMutex;
|
||||||
|
@ -162,9 +166,44 @@ int runServer(int argc, char* argv[])
|
||||||
error("ERROR on accept");
|
error("ERROR on accept");
|
||||||
|
|
||||||
std::cout<<"Client connected from "<<inet_ntoa(cli_addr.sin_addr)<<" socket "<<clientsockfd<<std::endl;
|
std::cout<<"Client connected from "<<inet_ntoa(cli_addr.sin_addr)<<" socket "<<clientsockfd<<std::endl;
|
||||||
|
|
||||||
|
ClientInfo clientInfo;
|
||||||
|
clientInfo.cli_addr = cli_addr;
|
||||||
|
clientInfo.clientsockfd = clientsockfd;
|
||||||
|
clientInfo.player = *player_iterator;
|
||||||
|
|
||||||
|
player_iterator++;
|
||||||
|
|
||||||
|
// Could verify if player is valid here
|
||||||
|
|
||||||
myClients.push_back({cli_addr,clientsockfd});
|
myClients.push_back({cli_addr,clientsockfd});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Perform the initial handshake with clients
|
||||||
|
for( auto client : myClients )
|
||||||
|
{
|
||||||
|
// Handshake currently just player
|
||||||
|
std::string handshake = std::string("player ")+std::to_string((int)client.player);
|
||||||
|
|
||||||
|
// Output the handshake
|
||||||
|
std::cout<<"Handshaking with "<<handshake<<std::endl;
|
||||||
|
|
||||||
|
// Send handshake
|
||||||
|
if ( write( client.clientsockfd,handshake.c_str(),handshake.length() ) < 0 )
|
||||||
|
error("ERROR sending to client");
|
||||||
|
|
||||||
|
// Recieve handshake
|
||||||
|
char buffer[64];
|
||||||
|
if (read(client.clientsockfd,buffer,sizeof(buffer)-1) < 0)
|
||||||
|
error("ERROR reading from client");
|
||||||
|
|
||||||
|
// Verify handshake
|
||||||
|
if ( std::string(buffer) != handshake )
|
||||||
|
error("Error in client handshake");
|
||||||
|
|
||||||
|
std::cout<<"Success on handshake with "<<handshake<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
std::cout<<"All clients connected"<<std::endl;
|
std::cout<<"All clients connected"<<std::endl;
|
||||||
|
|
||||||
// Loop for each turn
|
// Loop for each turn
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue