Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9e692d3

Browse files
committed
Making the server constructors not throw.
1 parent15484ba commit9e692d3

File tree

2 files changed

+63
-30
lines changed

2 files changed

+63
-30
lines changed

‎boost/network/protocol/http/server/async_server.hpp‎

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,22 @@ namespace boost { namespace network { namespace http {
2525
, Handler & handler
2626
, utils::thread_pool & thread_pool)
2727
: handler(handler)
28+
, address_(address)
29+
, port_(port)
2830
, thread_pool(thread_pool)
31+
, self_service(new asio::io_service())
2932
, io_service()
3033
, acceptor(io_service)
3134
, stopping(false)
32-
{
33-
using boost::asio::ip::tcp;
34-
tcp::resolverresolver(io_service);
35-
tcp::resolver::queryquery(address, port);
36-
tcp::endpoint endpoint = *resolver.resolve(query);
37-
acceptor.open(endpoint.protocol());
38-
acceptor.bind(endpoint);
39-
acceptor.listen();
40-
new_connection.reset(newconnection(io_service, handler, thread_pool));
41-
acceptor.async_accept(new_connection->socket(),
42-
boost::bind(
43-
&async_server_base<Tag,Handler>::handle_accept
44-
,this
45-
, boost::asio::placeholders::error));
46-
}
35+
, new_connection()
36+
, listening_mutex_()
37+
, listening(false)
38+
{}
4739

4840
voidrun() {
41+
boost::unique_lock<boost::mutex>listening_lock(listening_mutex_);
42+
if (!listening)start_listening();
43+
listening_lock.unlock();
4944
io_service.run();
5045
};
5146

@@ -58,11 +53,15 @@ namespace boost { namespace network { namespace http {
5853

5954
private:
6055
Handler & handler;
56+
string_type address_, port_;
6157
utils::thread_pool & thread_pool;
58+
std::auto_ptr<asio::io_service> self_service;
6259
asio::io_service io_service;
6360
asio::ip::tcp::acceptor acceptor;
6461
bool stopping;
6562
connection_ptr new_connection;
63+
boost::mutex listening_mutex_;
64+
bool listening;
6665

6766
voidhandle_accept(boost::system::error_codeconst & ec) {
6867
if (!ec) {
@@ -85,6 +84,23 @@ namespace boost { namespace network { namespace http {
8584
}
8685
}
8786
}
87+
88+
voidstart_listening() {
89+
using boost::asio::ip::tcp;
90+
tcp::resolverresolver(io_service);
91+
tcp::resolver::queryquery(address_, port_);
92+
tcp::endpoint endpoint = *resolver.resolve(query);
93+
acceptor.open(endpoint.protocol());
94+
acceptor.bind(endpoint);
95+
acceptor.listen();
96+
listening =true;
97+
new_connection.reset(newconnection(io_service, handler, thread_pool));
98+
acceptor.async_accept(new_connection->socket(),
99+
boost::bind(
100+
&async_server_base<Tag,Handler>::handle_accept
101+
,this
102+
, boost::asio::placeholders::error));
103+
}
88104
};
89105

90106
}/* http*/

‎boost/network/protocol/http/server/sync_server.hpp‎

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include<boost/network/protocol/http/request.hpp>
1616
#include<boost/network/protocol/http/server/sync_connection.hpp>
1717
#include<boost/network/traits/string.hpp>
18+
#include<boost/thread/mutex.hpp>
1819

1920
namespaceboost {namespacenetwork {namespacehttp {
2021

@@ -29,23 +30,20 @@ namespace boost { namespace network { namespace http {
2930
string_typeconst & port,
3031
Handler & handler)
3132
: handler_(handler)
32-
, service_()
33+
, address_(address)
34+
, port_(port)
35+
, self_service_(new boost::asio::io_service())
36+
, service_(*self_service_)
3337
, acceptor_(service_)
34-
, new_connection(new sync_connection<Tag,Handler>(service_, handler))
35-
{
36-
using boost::asio::ip::tcp;
37-
tcp::resolverresolver(service_);
38-
tcp::resolver::queryquery(address, port);
39-
tcp::endpoint endpoint = *resolver.resolve(query);
40-
acceptor_.open(endpoint.protocol());
41-
acceptor_.bind(endpoint);
42-
acceptor_.listen();
43-
acceptor_.async_accept(new_connection->socket(),
44-
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
45-
this, boost::asio::placeholders::error));
46-
}
38+
, new_connection()
39+
, listening_mutex_()
40+
, listening_(false)
41+
{}
4742

4843
voidrun() {
44+
boost::unique_lock<boost::mutex>listening_lock(listening_mutex_);
45+
if (!listening_)start_listening();
46+
listening_lock.unlock();
4947
service_.run();
5048
}
5149

@@ -57,9 +55,13 @@ namespace boost { namespace network { namespace http {
5755
private:
5856

5957
Handler & handler_;
60-
boost::asio::io_service service_;
58+
string_type address_, port_;
59+
std::auto_ptr<boost::asio::io_service> self_service_;
60+
boost::asio::io_service & service_;
6161
boost::asio::ip::tcp::acceptor acceptor_;
6262
boost::shared_ptr<sync_connection<Tag,Handler> > new_connection;
63+
boost::mutex listening_mutex_;
64+
bool listening_;
6365

6466
voidhandle_accept(boost::system::error_codeconst & ec) {
6567
if (!ec) {
@@ -70,6 +72,21 @@ namespace boost { namespace network { namespace http {
7072
this, boost::asio::placeholders::error));
7173
}
7274
}
75+
76+
voidstart_listening() {
77+
using boost::asio::ip::tcp;
78+
tcp::resolverresolver(service_);
79+
tcp::resolver::queryquery(address_, port_);
80+
tcp::endpoint endpoint = *resolver.resolve(query);
81+
acceptor_.open(endpoint.protocol());
82+
acceptor_.bind(endpoint);
83+
acceptor_.listen();
84+
listening_ =true;
85+
new_connection.reset(new sync_connection<Tag,Handler>(service_, handler_));
86+
acceptor_.async_accept(new_connection->socket(),
87+
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
88+
this, boost::asio::placeholders::error));
89+
}
7390
};
7491

7592
}/* http*/

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp