src/proto2/NetworkServer.cc
author terom
Wed, 05 Nov 2008 22:29:31 +0000
changeset 14 22e3bfb6720d
parent 13 3fbb927c6a27
child 15 7710cce889b2
permissions -rw-r--r--
NetworkServer.cc finally works as intended
#include "NetworkServer.hh"

#include <iostream>
#include <cassert>

NetworkServer::NetworkServer (GameState *state, const CL_IPAddress &listen_ip) : NetworkBase(), state(state) {
	socket.bind(listen_ip);
	
	// add socket to listener
	listener.add_trigger(socket.get_read_trigger());

	// bind slot for recv
	slot_on_recv = socket.sig_read_triggered().connect(this, &NetworkServer::_onRecv);
}

NetworkServer *NetworkServer::newServer (void) {
	GameState *state = new GameState(/* XXX */);
	CL_IPAddress listen_ip(NETWORK_PORT_STR);
	
	return new NetworkServer(state, listen_ip);
}		

void NetworkServer::run (void) {
	bool isRunning = true;

	while (isRunning) {
		/* XXX: all I need to do? */
		listener.wait();
		CL_System::keep_alive();
		listener.reset_all();
	}
}

void NetworkServer::_onRecv (void) {
	char buf[NETWORK_PACKET_MAX];
	CL_IPAddress src;
	int ret;

	std::cout << "NetworkServer::_onRecv: recv" << std::endl;

	ret = socket.recv((void*) buf, NETWORK_PACKET_MAX, src);

	assert(ret > 0);

	std::cout << src.get_address() << ":" << src.get_port() << " <- " << std::string(buf, ret) << std::endl;
}
		
NetworkServerClient::NetworkServerClient (NetworkServer &server) : server(server) {
	
}
		
void runNetworkServer (void) {
	NetworkServer *server = NULL;
	
	try {
		server = NetworkServer::newServer();
		server->run();
	} catch (CL_Error &e) {
		std::cerr << "runNetworkServer: CL_Error: " << e.message << std::endl;
	}
}

int main (int argc, char **argv) {
	// setup ClanLib components
	CL_SetupCore setup_core;
	CL_SetupNetwork setup_network;
	
	// create the gamestate and run the server
	runNetworkServer();

	return 0;
}