Blob Blame Raw

#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;
}