Exception throwing added,

Tested:
mysql_server <-> tcp_socket <-> xerxes <-> unix_socket <-> xerxes <-> tcp_socket <-> mysql/netcat
This commit is contained in:
Jan Losinshi 2008-08-26 15:33:05 +02:00
parent 95daea3155
commit b05046dfac
4 changed files with 61 additions and 32 deletions

View File

@ -40,9 +40,9 @@ namespace xerxes
events[target.fd]->data.fd = source.fd; events[target.fd]->data.fd = source.fd;
if(0 != epoll_ctl(fd, EPOLL_CTL_ADD, source.fd, events[source.fd].get())) if(0 != epoll_ctl(fd, EPOLL_CTL_ADD, source.fd, events[source.fd].get()))
throw EpollAddErr(); throw EpollAddErr(EPOLL_ADD_ERR_SOURCE);
if(0 != epoll_ctl(fd, EPOLL_CTL_ADD, target.fd, events[target.fd].get())) if(0 != epoll_ctl(fd, EPOLL_CTL_ADD, target.fd, events[target.fd].get()))
throw EpollAddErr(); throw EpollAddErr(EPOLL_ADD_ERR_TARGET);
} }
void void
@ -63,5 +63,26 @@ namespace xerxes
throw EpollAddErr(); throw EpollAddErr();
events.erase(socket.fd); events.erase(socket.fd);
} }
EpollErr::EpollErr()
{
EpollErr("unknown");
}
EpollErr::EpollErr(std::string err)
{
std::cerr << "Epoll Error: " << err << std::endl;
perror("ERRNO");
}
EpollAddErr::EpollAddErr()
{
EpollAddErr(ADD_ERR_SINGLE);
}
EpollAddErr::EpollAddErr(epoll_add_err_type t)
:EpollErr("could not add fd to epoll!"), type(t)
{
}
} }

View File

@ -42,23 +42,32 @@ namespace xerxes
std::map<int, event_t> events; std::map<int, event_t> events;
}; };
enum epoll_add_err_type{ enum epoll_add_err_type
ADD_ERR_SINGLE, {
ADD_ERR_SOURCE, EPOLL_ADD_ERR_SINGLE,
ADD_ERR_TARGET EPOLL_ADD_ERR_SOURCE,
EPOLL_ADD_ERR_TARGET
}; };
class EpollErr{}; class EpollErr
{
public:
EpollErr();
EpollErr(std::string err);
};
class EpollAddErr : public EpollErr { class EpollAddErr : public EpollErr {
public: public:
EpollAddErr(){ EpollAddErr();
EpollAddErr(ADD_ERR_SINGLE); EpollAddErr(epoll_add_err_type t);
};
EpollAddErr(epoll_add_err_type t)
:type(t){};
epoll_add_err_type type; epoll_add_err_type type;
}; };
class EpollDelErr : public EpollErr {}; class EpollDelErr : public EpollErr {
class EpollCreateErr : public EpollErr {}; public:
EpollDelErr() : EpollErr("could not delete fd from epoll"){};
};
class EpollCreateErr : public EpollErr {
public:
EpollCreateErr() : EpollErr("could not create Epoll"){};
};
} }
#endif #endif

View File

@ -20,7 +20,6 @@ namespace xerxes
int domain) int domain)
: fd(socket(protocol, type, domain)) : fd(socket(protocol, type, domain))
{ {
std::cerr << "new socket" << std::endl;
if(fd < 0) if(fd < 0)
{ {
throw ConnCreateErr(); throw ConnCreateErr();
@ -263,6 +262,6 @@ namespace xerxes
} }
SocketErr::SocketErr(std::string err){ SocketErr::SocketErr(std::string err){
std::cerr << "Socket Exception: " << err << std::endl; std::cerr << "Socket Exception: " << err << std::endl;
perror("ERROR:"); perror("ERRNO");
} }
} }

View File

@ -30,14 +30,9 @@ main(int argc, char* argv[])
namespace po = boost::program_options; namespace po = boost::program_options;
using namespace std; using namespace std;
using namespace xerxes; using namespace xerxes;
cout << "Hello, World!" << endl
<< "ich kanns auch lassen, hier `Hello, World!' zu schreiben..."
<< endl;
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
// Declare the supported options.
po::options_description desc("Allowed options"); po::options_description desc("Allowed options");
desc.add_options() desc.add_options()
("help", "produce help message") ("help", "produce help message")
@ -60,6 +55,7 @@ main(int argc, char* argv[])
{ {
SocketOption sock = vm["src"].as<SocketOption>(); SocketOption sock = vm["src"].as<SocketOption>();
} }
if (vm.count("dst")) if (vm.count("dst"))
{ {
SocketOption sock = vm["dst"].as<SocketOption>(); SocketOption sock = vm["dst"].as<SocketOption>();
@ -80,6 +76,7 @@ main(int argc, char* argv[])
SocketOption src = vm["src"].as<SocketOption>(); SocketOption src = vm["src"].as<SocketOption>();
Socket &lstn = *(src.gen_socket()); Socket &lstn = *(src.gen_socket());
if(src.type == TCP) if(src.type == TCP)
{ {
cout << "TCP Source is " << src.hostname << "," << src.port << ".\n"; cout << "TCP Source is " << src.hostname << "," << src.port << ".\n";
@ -91,11 +88,7 @@ main(int argc, char* argv[])
bind_unix(lstn, src); bind_unix(lstn, src);
} }
int ret = listen(lstn, 3); listen(lstn, 3);
if( ret != 0)
{
exit(1);
}
EPoll epoll; EPoll epoll;
epoll.add(lstn); epoll.add(lstn);
@ -117,10 +110,17 @@ main(int argc, char* argv[])
{ {
SocketOption dst = vm["dst"].as<SocketOption>(); SocketOption dst = vm["dst"].as<SocketOption>();
boost::shared_ptr<Socket> target(dst.gen_socket()); boost::shared_ptr<Socket> target(dst.gen_socket());
connect_inet(*target, dst); if (dst.type == TCP)
{
connect_inet(*target, dst);
}
else
{
connect_unix(*target, dst);
}
sockets[target->fd] = target; sockets[target->fd] = target;
cerr << "accept!" << endl; // cerr << "accept!" << endl;
boost::shared_ptr<Socket> source(accept(lstn, 0, 0)); boost::shared_ptr<Socket> source(accept(lstn, 0, 0));
sockets[source->fd] = source; sockets[source->fd] = source;
@ -131,7 +131,7 @@ main(int argc, char* argv[])
{ {
if(sockets[events[i].data.fd] == 0) if(sockets[events[i].data.fd] == 0)
{ {
cerr << "already closed, ignore" << endl; // cerr << "already closed, ignore" << endl;
continue; continue;
} }
//lookup //lookup
@ -152,12 +152,12 @@ main(int argc, char* argv[])
catch (SocketErr e) catch (SocketErr e)
{ {
// hangup // hangup
cout << "Socket Error, closing " << target->fd << " and " << source->fd << endl; // cout << "Socket Error, closing " << target->fd << " and " << source->fd << endl;
epoll.del(target->fd); epoll.del(target->fd);
epoll.del(source->fd); epoll.del(source->fd);
sockets.erase(target->fd); sockets.erase(target->fd);
sockets.erase(source->fd); sockets.erase(source->fd);
cerr << "closed" << endl; // cerr << "closed" << endl;
continue; continue;
} }
} }
@ -165,7 +165,7 @@ main(int argc, char* argv[])
|| (events[i].events & EPOLLHUP)) || (events[i].events & EPOLLHUP))
{ {
// hangup // hangup
cout << target->fd << " closed by " << source->fd << endl; // cout << target->fd << " closed by " << source->fd << endl;
epoll.del(target->fd); epoll.del(target->fd);
epoll.del(source->fd); epoll.del(source->fd);
sockets.erase(target->fd); sockets.erase(target->fd);