- int fd = socket (AF_INET, SOCK_STREAM, 0);
- if (fd < 0) {
- throw NetworkError ("could not open socket");
- }
-
- int const o = 1;
- setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof (o));
-
- struct timeval tv;
- tv.tv_sec = 20;
- tv.tv_usec = 0;
- setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (void *) &tv, sizeof (tv));
- setsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (void *) &tv, sizeof (tv));
-
- struct sockaddr_in server_address;
- memset (&server_address, 0, sizeof (server_address));
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = INADDR_ANY;
- server_address.sin_port = htons (Config::instance()->server_port ());
- if (::bind (fd, (struct sockaddr *) &server_address, sizeof (server_address)) < 0) {
- stringstream s;
- s << "could not bind to port " << Config::instance()->server_port() << " (" << strerror (errno) << ")";
- throw NetworkError (s.str());
- }
-
- listen (fd, BACKLOG);
-
+ asio::io_service io_service;
+ asio::ip::tcp::acceptor acceptor (io_service, asio::ip::tcp::endpoint (asio::ip::tcp::v4(), Config::instance()->server_port ()));