summaryrefslogtreecommitdiff
path: root/src/lib/util.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-11-05 22:43:34 +0000
committerCarl Hetherington <cth@carlh.net>2013-11-05 22:43:34 +0000
commitf660fe3f1be97f373318806a77b3ce3fcd53cb73 (patch)
tree3d862060843ad00aae4c23008912ba7d21a38ca2 /src/lib/util.cc
parent5698918140d640b3477634504a83da0d8d71a1cf (diff)
Various work on server discovery; works on localhost.
Diffstat (limited to 'src/lib/util.cc')
-rw-r--r--src/lib/util.cc41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 96b834fcc..e2ce94dd9 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -90,6 +90,7 @@ using std::istream;
using std::numeric_limits;
using std::pair;
using std::ofstream;
+using std::cout;
using boost::shared_ptr;
using boost::thread;
using boost::lexical_cast;
@@ -518,17 +519,27 @@ dcp_audio_frame_rate (int fs)
Socket::Socket (int timeout)
: _deadline (_io_service)
, _socket (_io_service)
+ , _acceptor (0)
, _timeout (timeout)
{
_deadline.expires_at (boost::posix_time::pos_infin);
check ();
}
+Socket::~Socket ()
+{
+ delete _acceptor;
+}
+
void
Socket::check ()
{
if (_deadline.expires_at() <= boost::asio::deadline_timer::traits_type::now ()) {
- _socket.close ();
+ if (_acceptor) {
+ _acceptor->cancel ();
+ } else {
+ _socket.close ();
+ }
_deadline.expires_at (boost::posix_time::pos_infin);
}
@@ -539,7 +550,7 @@ Socket::check ()
* @param endpoint End-point to connect to.
*/
void
-Socket::connect (boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const & endpoint)
+Socket::connect (boost::asio::ip::tcp::endpoint endpoint)
{
_deadline.expires_from_now (boost::posix_time::seconds (_timeout));
boost::system::error_code ec = boost::asio::error::would_block;
@@ -548,11 +559,35 @@ Socket::connect (boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> con
_io_service.run_one();
} while (ec == boost::asio::error::would_block);
- if (ec || !_socket.is_open ()) {
+ if (ec) {
+ throw NetworkError (ec.message ());
+ }
+
+ if (!_socket.is_open ()) {
throw NetworkError (_("connect timed out"));
}
}
+void
+Socket::accept (int port)
+{
+ _acceptor = new boost::asio::ip::tcp::acceptor (_io_service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port));
+
+ _deadline.expires_from_now (boost::posix_time::seconds (_timeout));
+ boost::system::error_code ec = boost::asio::error::would_block;
+ _acceptor->async_accept (_socket, boost::lambda::var(ec) = boost::lambda::_1);
+ do {
+ _io_service.run_one ();
+ } while (ec == boost::asio::error::would_block );
+
+ delete _acceptor;
+ _acceptor = 0;
+
+ if (ec) {
+ throw NetworkError (ec.message ());
+ }
+}
+
/** Blocking write.
* @param data Buffer to write.
* @param size Number of bytes to write.