X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=judge%2Fmanager%2Fnetwork_controller.cpp;fp=judge%2Fmanager%2Fnetwork_controller.cpp;h=aed27b7a1593d1272586326b4c3e25703d6de0c4;hp=0000000000000000000000000000000000000000;hb=48216daa641008e0de21c5522d6e958a38b02093;hpb=38c6e9b9fc245ca5e6e6cee2806cb64dcbd34e35 diff --git a/judge/manager/network_controller.cpp b/judge/manager/network_controller.cpp new file mode 100644 index 0000000..aed27b7 --- /dev/null +++ b/judge/manager/network_controller.cpp @@ -0,0 +1,102 @@ +#include "network_controller.h" + +NetworkController::NetworkController(const Piece::Colour & newColour, const char * newName) : Controller(newColour, newName), sfd(-1) +{ + struct protoent * tcp = getprotobyname("tcp"); + + sfd = socket(PF_INET, SOCK_STREAM, tcp->p_proto); + if (sfd == -1) + { + fprintf(stderr, "NetworkController::NetworkController - couldn't create a TCP socket!"); + return; + } +} + +NetworkController::~NetworkController() +{ + if (Valid()) + { + if (shutdown(sfd, SHUT_RDWR) == -1) + { + fprintf(stderr, "NetworkController::~NetworkController - Can't shutdown socket %d!", sfd); + close(sfd); + sfd = -1; + } + } + close(sfd); +} + +Server::Server(const Piece::Colour & newColour, const char * newName) : NetworkController(newColour, newName) +{ + struct sockaddr_in ipa; + ipa.sin_family = AF_INET; + ipa.sin_port = htons(NetworkController::port); + ipa.sin_addr.s_addr = INADDR_ANY; + memset(&ipa,0, sizeof ipa); + + if (bind(sfd, (struct sockaddr*)&sfd, sizeof sfd) == -1) + { + fprintf(stderr, "Server::Server - Couldn't bind to socket! Abort\n"); + close(sfd); + sfd = -1; + return; + } + + //Listen for at most 1 connection + if (listen(sfd, 1) == -1) + { + fprintf(stderr, "Server::Server - listening failed.\n"); + close(sfd); + sfd = -1; + return; + } + + //Accept the connection + sfd = accept(sfd, NULL, NULL); + if (sfd < 0) + { + fprintf(stderr, "Server::Server - couldn't accept connection.\n"); + close(sfd); + sfd = -1; + return; + } + + //We are now ready to play! +} + + +Client::Client(const Piece::Colour & newColour, const char * newName, const char * server) : NetworkController(newColour, newName) +{ + struct sockaddr_in ipa; + ipa.sin_family = AF_INET; + ipa.sin_port = htons(NetworkController::port); + int Res = inet_pton(AF_INET, server, &ipa.sin_addr); + + if (Res < 0) + { + fprintf(stderr, "Client::Client - First parameter is not a valid address family!\n"); + close(sfd); + sfd = -1; + return; + } + else if (Res == 0) + { + fprintf(stderr, "Client::Client - Second parameter does not contain a valid IP Address!\n"); + close(sfd); + sfd = -1; + return; + } + + if (connect(sfd, (struct sockaddr*)&sfd, sizeof sfd) == -1) + { + fprintf(stderr, "Client::Client - Connection to server at \"%s\" failed.\n", server); + close(sfd); + sfd = -1; + return; + } + + //We are now ready to play! +} +//EOF + +