21
21
22
22
namespace boost { namespace network { namespace http {
23
23
24
+ struct socket_options_base {
25
+ protected:
26
+ asio::socket_base::reuse_address acceptor_reuse_address;
27
+ asio::socket_base::enable_connection_aborted acceptor_report_aborted;
28
+ asio::socket_base::receive_buffer_size receive_buffer_size;
29
+ asio::socket_base::send_buffer_size send_buffer_size;
30
+ asio::socket_base::receive_low_watermark receive_low_watermark;
31
+ asio::socket_base::send_low_watermark send_low_watermark;
32
+ asio::socket_base::non_blocking_io non_blocking_io;
33
+ asio::socket_base::linger linger;
34
+
35
+ template <class ArgPack >
36
+ socket_options_base (ArgPack const & args)
37
+ : acceptor_reuse_address(args[_reuse_address|false ])
38
+ , acceptor_report_aborted(args[_report_aborted|false ])
39
+ , receive_buffer_size(args[_receive_buffer_size|1024 ])
40
+ , send_buffer_size(args[_send_buffer_size|1024 ])
41
+ , receive_low_watermark(args[_receive_low_watermark|512 ])
42
+ , send_low_watermark(args[_send_low_watermark|512 ])
43
+ , non_blocking_io(args[_non_blocking_io|true ])
44
+ , linger(args[_linger|true ], args[_linger_timeout|0 ])
45
+ {}
46
+
47
+ void acceptor_options (boost::asio::ip::tcp::acceptor & acceptor) {
48
+ acceptor.set_option (acceptor_reuse_address);
49
+ acceptor.set_option (acceptor_report_aborted);
50
+ }
51
+
52
+ void socket_options (boost::asio::ip::tcp::socket & socket) {
53
+ socket.set_option (receive_buffer_size);
54
+ socket.set_option (receive_low_watermark);
55
+ socket.set_option (send_buffer_size);
56
+ socket.set_option (send_low_watermark);
57
+ socket.io_control (non_blocking_io);
58
+ socket.set_option (linger);
59
+ }
60
+ };
61
+
24
62
template <class Tag , class Handler >
25
- struct sync_server_base : server_storage_base {
63
+ struct sync_server_base : server_storage_base, socket_options_base {
26
64
typedef typename string<Tag>::type string_type;
27
65
typedef basic_request<Tag> request;
28
66
typedef basic_response<Tag> response;
@@ -39,6 +77,7 @@ namespace boost { namespace network { namespace http {
39
77
server_storage_base::no_io_service,
40
78
server_storage_base::has_io_service
41
79
>::type())
80
+ , socket_options_base(args)
42
81
, handler_(args[_handler])
43
82
, address_(args[_address])
44
83
, port_(args[_port])
@@ -75,6 +114,7 @@ namespace boost { namespace network { namespace http {
75
114
76
115
void handle_accept (boost::system::error_code const & ec) {
77
116
if (!ec) {
117
+ socket_options_base::socket_options (new_connection->socket ());
78
118
new_connection->start ();
79
119
new_connection.reset (new sync_connection<Tag,Handler>(service_, handler_));
80
120
acceptor_.async_accept (new_connection->socket (),
@@ -90,6 +130,7 @@ namespace boost { namespace network { namespace http {
90
130
tcp::endpoint endpoint = *resolver.resolve (query);
91
131
acceptor_.open (endpoint.protocol ());
92
132
acceptor_.bind (endpoint);
133
+ socket_options_base::acceptor_options (acceptor_);
93
134
acceptor_.listen ();
94
135
listening_ = true ;
95
136
new_connection.reset (new sync_connection<Tag,Handler>(service_, handler_));
0 commit comments