proxy_teste.cpp 2.08 KB
#include "jdatagramsocket.h"

#include <iostream>
#include <stdexcept>

#include <fcntl.h>

using namespace jsocket;

#define BUFFER_SIZE	4096

std::vector<DatagramSocket *> hosts;
FILE *fd_hosts;
int receive_port;

int file_parser() 
{
	DatagramSocket *client;
	char *line = NULL;
	size_t length;
	ssize_t rd;

	char *host, *t;
	int port;
	
	while ((rd = getline(&line, &length, fd_hosts)) != EOF) {
		try {
			t = strtok(line, ":");

			if (t == NULL) {
				continue;
			}
			
			host = t;
			
			t = strtok(NULL, ":");

			if (t == NULL) {
				continue;
			}
			
			port = atoi(t);
			
			client = new DatagramSocket(host, port);
	
			if (client != NULL) {
				hosts.push_back(client);
			}

		} catch (...) {
			std::cout << "Error in file parser !" << std::endl;
		}
	}
	
	if (line != NULL) {
		delete [] line;
	}
	
	return 0;
}

int init_args(int argc, char **argv)
{
	if (argc != 3) {
		return -1;
	}

	receive_port = atoi(argv[1]);

	fd_hosts = fopen(argv[2], "r");

	if (fd_hosts == NULL) {
		return -1;
	}

	return 0;
}

int init_proxy()
{
	DatagramSocket server(receive_port);
	DatagramSocket *client;
	
	char buffer[BUFFER_SIZE];
	size_t length;
	
	std::vector<DatagramSocket *>::iterator i;
	
	
	while (true) {
		try {
			length = server.Receive(buffer, BUFFER_SIZE);

			for (i=hosts.begin(); i!=hosts.end(); i++) {
				client = (DatagramSocket *)(*i);

				if (client->Send(buffer, length) < 0) {
					std::cout << "Cliente " << client->GetInetAddress()->GetHostName() << " morto !" << std::endl;
				}
			}
		} catch (std::runtime_error &e) {
			std::cout << "error in init proxy" << e.what() << std::endl;
		}
	}

	return 0;
}

void help(char *p)
{
	std::cout << "JProxy\n" << std::endl;
	std::cout << "use: " << p << " <recv_port> <file_hosts>\n" << std::endl;

	exit(1);
}

int main(int argc, char **argv)
{
	if (init_args(argc, argv) == -1) {
		help(argv[0]);
	}

	if (file_parser() == -1) {
		help(argv[0]);
	}

	if (init_proxy() == -1) {
		return -1;
	}
	
	return 0;
}