Began implementation of networking
[progcomp2012.git] / judge / manager / network_controller.cpp
diff --git a/judge/manager/network_controller.cpp b/judge/manager/network_controller.cpp
new file mode 100644 (file)
index 0000000..aed27b7
--- /dev/null
@@ -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
+
+

UCC git Repository :: git.ucc.asn.au