#include #include #include "UDPTCPNetwork.h" #define DEFAULT_PORT 12345 void server () { TCP tcpserver; TCP *connection; SSLSocket ssl; int i, timeout; pid_t pid; char buffer[NET_BUFFERSIZE]; // // start the server if (tcpserver.Listen(DEFAULT_PORT) != 1) { printf ("cloud not start the tcp server\n"); exit (1); } // // init SSL if (ssl.SetCertificat("cert.pem", "privkey.pem") != 1) { printf ("SetCertificat error:%s\n", strerror(errno)); exit (1); } // // check for connections for (timeout = 10; timeout > 0; timeout--) { connection = tcpserver.Accept(); if (connection != NULL) { // // someone connected - create new process // take care of parallel processing (parent is always the server) // printf (" server: got a connection forking new process\n"); pid = fork(); if (pid == 0) { // // child process - always close server since it will handeled // by the parent process. Make sure the client exits and never // returns. tcpserver.Close(); if (ssl.Accept(connection->GetSocket()) != 1) { printf ("could not establish SSL connection:%s\n", strerror(errno)); exit (1); } i = ssl.Read(buffer, NET_BUFFERSIZE); if (i > 0) { int c; printf (" server: got: '%s'\n", buffer); for (c = 0; c < i; c++) buffer[c] = toupper(buffer[c]); ssl.Write(buffer, i); } // // just delete the class object, it will close the client connection ssl.Close(); delete (connection); // // exit child process exit (1); } else { // // parent process - just close the client connection // it will be handeled by the child process. delete (connection); } } sleep (1); } }; void client () { TCP tcpclient; SSLSocket ssl; char buffer[NET_BUFFERSIZE]; int i; sleep (1); // wait one second to start the server // // connect to the server if (tcpclient.Connect ("localhost", DEFAULT_PORT) != 1) { printf ("cloud not connect to server\n"); exit (1); } if (ssl.Connect(tcpclient.GetSocket()) != 1) { printf ("could not establish SSL connection:%s\n", strerror(errno)); exit (1); } // // send some data snprintf (buffer, NET_BUFFERSIZE, "nur ein kleiner Test."); printf ("client:send '%s' to the server.\n", buffer); if (ssl.Write(buffer, strlen (buffer)) != strlen (buffer)) { printf ("could not send all data.\n"); exit (1); } // // read some data (wait maximum 10x1000ms) for (i = 10; i > 0; i--) if (ssl.Read(buffer, NET_BUFFERSIZE) > 0) { printf ("client:got '%s' from server.\n", buffer); break; } // // close connection ssl.Close(); tcpclient.Close(); }; int main (int argc, char **argv) { pid_t pid; pid = fork(); if (pid == 0) { // child process printf ("start client\n"); client(); printf ("start client\n"); client(); printf ("start client\n"); client(); printf ("start client\n"); client(); } else { // parent process server(); } return 0; };