tcp socket is reuseable,

more try/catch for exceptions
This commit is contained in:
Jan Losinshi 2008-08-26 16:26:06 +02:00
parent b05046dfac
commit a88b861089
2 changed files with 46 additions and 13 deletions

View File

@ -235,7 +235,10 @@ namespace xerxes
hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST; hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
getaddrinfo(opt.hostname.c_str(), opt.port.c_str(), &hints, &res); getaddrinfo(opt.hostname.c_str(), opt.port.c_str(), &hints, &res);
int so_opt = 1;
setsockopt(socket.fd, SOL_SOCKET, SO_REUSEADDR, (char*)&so_opt, sizeof(so_opt));
int ret = bind(socket, res->ai_addr, res->ai_addrlen); int ret = bind(socket, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res); freeaddrinfo(res);

View File

@ -108,24 +108,54 @@ main(int argc, char* argv[])
if((events[i].data.fd == -1) if((events[i].data.fd == -1)
&& (events[i].events & EPOLLIN)) && (events[i].events & EPOLLIN))
{ {
SocketOption dst = vm["dst"].as<SocketOption>(); boost::shared_ptr<Socket> target;
boost::shared_ptr<Socket> target(dst.gen_socket()); boost::shared_ptr<Socket> source;
if (dst.type == TCP) try
{ {
connect_inet(*target, dst); SocketOption dst = vm["dst"].as<SocketOption>();
target = boost::shared_ptr<Socket>(dst.gen_socket());
if (dst.type == TCP)
{
connect_inet(*target, dst);
}
else
{
connect_unix(*target, dst);
}
sockets[target->fd] = target;
} }
else catch (SocketErr)
{ {
connect_unix(*target, dst); continue;
} }
sockets[target->fd] = target;
// cerr << "accept!" << endl; try
boost::shared_ptr<Socket> source(accept(lstn, 0, 0)); {
source = boost::shared_ptr<Socket>(accept(lstn, 0, 0));
sockets[source->fd] = source;
}
catch (SocketErr e)
{
sockets.erase(target->fd);
continue;
}
sockets[source->fd] = source; try
{
epoll.add(*source, *target); epoll.add(*source, *target);
}
catch (EpollAddErr e)
{
if (e.type != EPOLL_ADD_ERR_SOURCE)
{
epoll.del(target->fd);
}
epoll.del(target->fd);
epoll.del(source->fd);
sockets.erase(target->fd);
sockets.erase(source->fd);
continue;
}
} }
else else
{ {