From a88b861089565094e695ddcd724c1b39a800a786 Mon Sep 17 00:00:00 2001 From: Jan Losinshi Date: Tue, 26 Aug 2008 16:26:06 +0200 Subject: [PATCH] tcp socket is reuseable, more try/catch for exceptions --- socket.cxx | 5 ++++- xerxes.cxx | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/socket.cxx b/socket.cxx index cde5367..eee6ca3 100644 --- a/socket.cxx +++ b/socket.cxx @@ -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); diff --git a/xerxes.cxx b/xerxes.cxx index 9c968ef..8045059 100644 --- a/xerxes.cxx +++ b/xerxes.cxx @@ -108,24 +108,54 @@ main(int argc, char* argv[]) if((events[i].data.fd == -1) && (events[i].events & EPOLLIN)) { - SocketOption dst = vm["dst"].as(); - boost::shared_ptr target(dst.gen_socket()); - if (dst.type == TCP) + boost::shared_ptr target; + boost::shared_ptr source; + try { - connect_inet(*target, dst); + SocketOption dst = vm["dst"].as(); + target = boost::shared_ptr(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 source(accept(lstn, 0, 0)); + try + { + source = boost::shared_ptr(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 {