You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.1 KiB

#include <string.h>
#include <unistd.h>
#include "UDPTCPNetwork.h"
#define DEFAULT_PORT 12345
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
#else
int test_sha256() {
// generated with echo -n topsecret | sha256sum
std::string hash_test = "53336a676c64c1396553b2b7c92f38126768827c93b64d9142069c10eda7a721";
std::string in = "topsecret";
std::string hash = getsha256sum(&in);
if (hash.compare(hash_test) != 0) {
printf ("test for sha256 hash failed. please fix function getsha256sum()\n");
exit (1);
}
else printf ("ok\n");
return 0;
};
void server () {
TCP tcpserver;
TCP *connection;
SSLSocket ssl;
int i, timeout;
pid_t pid;
time_t time_start = time (NULL);
time_t time_now = time (NULL);
char buffer[NET_BUFFERSIZE];
//
// test sha function
if (test_sha256() != 0) {
printf ("getsha256sum - test failed\n");
exit(1);
}
//
// start the server
printf ("server: starting server\n");
if (tcpserver.Listen(DEFAULT_PORT) != 1) {
printf ("server: cloud not start the tcp server\n");
exit (1);
}
//
// init SSL
printf ("server: setting up certificates\n");
if (ssl.SetCertificat("cert.pem", "privkey.pem") != 1) {
printf ("server: SetCertificat error:%s\n", strerror(errno));
exit (1);
}
//
// check for connections
printf ("server: wait for connection\n");
for (;time_now - time_start < 10; time_now = time(NULL)) {
connection = tcpserver.Accept();
if (connection != NULL) {
//
// someone connected - create new process
// take care of parallel processing (parent is always the server)
//
printf ("server: someone connected.\n");
printf ("server: accept ssl connection\n");
if (ssl.Accept(connection->GetSocket(), 0) != 1) {
printf ("server: 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);
}
else {
printf ("server: nothing to read. close connection.\n");
}
//
// just delete the class object, it will close the client connection
ssl.Close();
delete (connection);
connection = NULL;
}
usleep (250000);
}
printf ("server: terminating server process.\n");
};
void client () {
TCP tcpclient;
SSLSocket ssl;
char buffer[NET_BUFFERSIZE];
int i, res;
sleep (1); // wait one second to start the server
//
// connect to the server
printf ("client: connect to localhost\n");
if (tcpclient.Connect ("localhost", DEFAULT_PORT) != 1) {
printf ("client: cloud not connect to server\n");
exit (1);
}
printf ("client: connected\n");
printf ("client: start SSL connection\n");
if (ssl.Connect(tcpclient.GetSocket(), 100) != 1) {
printf ("client: could not establish SSL connection:errno:%s sslerror:%s\n", strerror(errno), ssl.GetSSLErrorText(ssl.sslerror).c_str());
exit (1);
}
printf ("client: ssl connected.\n");
//
// 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 ("client: could not send all data. errno:%s sslerror:%s\n", strerror(errno), ssl.GetSSLErrorText(ssl.sslerror).c_str());
exit (1);
}
//
// read some data (wait maximum 10x1000ms)
for (i = 10; i > 0; i--) {
printf ("client: try to read\n");
if ((res = ssl.Read(buffer, NET_BUFFERSIZE)) > 0) {
printf ("client: got '%s' from server.\n", buffer);
break;
}
else if (res < 0) {
printf ("client: error on read: Error: %s\n", strerror(errno));
}
else {
printf ("client: no data\n");
}
}
//
// close connection
ssl.Close();
tcpclient.Close();
};
#endif
int main (int argc, char **argv) {
pid_t pid;
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
#else
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();
}
#endif
return 0;
};