#include <cstdio>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "protocol.h"
#define myprintf(...) do { printf(__VA_ARGS__); fflush(stdout); } while(0);
class MyConnection: public Connection {
public:
const char *name;
Task readTask, writeTask;
char data[2][100];
MyConnection(const char *name):
name(name), readTask(data[0], 16), writeTask(data[1], 16), data()
{ strcpy(data[1], "01234567890123456789"); }
protected:
void onOpeningError() override
{ myprintf("%s: onOpeningError\n", name); }
void onOpen(const void*, size_t) override
{ myprintf("%s: onOpen\n", name); read(readTask); write(writeTask); }
void onReadReady(Task &task, bool error) override {
data[0][task.completion] = 0;
myprintf("%s: onReadReady: %lu, %lu, %s, %d\n", name, task.completion, task.size, (char*)task.data, error);
task.completion = 0;
read(task);
}
void onWriteReady(Task &task, bool error) override {
myprintf("%s: onWriteReady: %d\n", name, error);
task.completion = 0;
write(task);
}
void onCloseReqested() override
{ myprintf("%s: onCloseReqested\n", name); close(false); }
void onClose(bool error) override
{ myprintf("%s: onClose: %d\n", name, (int)error); }
};
class MyServer: public Server {
protected:
void onOpeningError() override
{ myprintf("Server: onOpeningError\n"); }
void onOpen(const void*, size_t) override
{ myprintf("Server: onOpen\n"); }
Connection* onConnect(const void*, size_t) override
{ myprintf("Server: onConnect\n"); return new MyConnection("server connection"); }
void onDisconnect(Connection *connection, bool error) override
{ myprintf("Server: onDisconnect: %d\n", error); delete connection; }
void onCloseReqested() override
{ myprintf("Server: onCloseReqested\n"); }
void onClose(bool error) override
{ myprintf("Server: onClose: %d\n", error); }
};
int main(int argc, char **) {
bool server = argc == 1;
myprintf("init protocol\n");
Protocol protocol;
protocol.open();
myprintf("protocol open\n");
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(1532);
//addr.sin_port = htons(80);
if (server) {
myprintf("init server\n");
MyServer server;
if (!server.open(protocol, &addr, sizeof(addr))) {
myprintf("cannot open server\n");
} else {
myprintf("server open\n");
myprintf("wait 10s\n");
//std::this_thread::sleep_for( std::chrono::seconds(10) );
fgetc(stdin);
myprintf("close server\n");
server.closeWait();
}
} else {
myprintf("init connection\n");
MyConnection connection("client connection");
if (!connection.open(protocol, &addr, sizeof(addr))) {
myprintf("cannot open connection\n");
} else {
myprintf("connection open\n");
myprintf("wait 10s\n");
//std::this_thread::sleep_for( std::chrono::seconds(10) );
fgetc(stdin);
myprintf("close connection\n");
connection.closeWait();
}
}
myprintf("close protocol\n");
protocol.closeWait();
myprintf("protocol closed\n");
return 0;
}