mirror of https://github.com/agdsn/xerxes.git
Exception throwing added,
Tested: mysql_server <-> tcp_socket <-> xerxes <-> unix_socket <-> xerxes <-> tcp_socket <-> mysql/netcat
This commit is contained in:
parent
95daea3155
commit
b05046dfac
25
epoll.cxx
25
epoll.cxx
|
|
@ -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
|
||||||
|
|
@ -64,4 +64,25 @@ namespace xerxes
|
||||||
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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
33
epoll.hxx
33
epoll.hxx
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
32
xerxes.cxx
32
xerxes.cxx
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue