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;
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);
freeaddrinfo(res);

View File

@ -108,24 +108,54 @@ main(int argc, char* argv[])
if((events[i].data.fd == -1)
&& (events[i].events & EPOLLIN))
{
SocketOption dst = vm["dst"].as<SocketOption>();
boost::shared_ptr<Socket> target(dst.gen_socket());
if (dst.type == TCP)
boost::shared_ptr<Socket> target;
boost::shared_ptr<Socket> source;
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;
boost::shared_ptr<Socket> source(accept(lstn, 0, 0));
try
{
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;
epoll.add(*source, *target);
try
{
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
{