diff --git a/private/cgi_acceptor.h b/private/cgi_acceptor.h index 2a04219..8746d9e 100644 --- a/private/cgi_acceptor.h +++ b/private/cgi_acceptor.h @@ -43,7 +43,9 @@ namespace impl { srv_(srv), acceptor_(srv_.get_io_service()), stopped_(false), - tcp_(true) + tcp_(true), + sndbuf_(-1), + rcvbuf_(-1) { io::endpoint ep(ip,port); acceptor_.open(ep.family()); @@ -133,12 +135,27 @@ namespace impl { acceptor_.cancel(); } + void sndbuf(int v) + { + sndbuf_ = v; + } + void rcvbuf(int v) + + { + rcvbuf_ = v; + } + private: void on_accept(booster::system::error_code const &e) { if(!e) { + if(tcp_) asio_socket_->set_option(io::basic_socket::tcp_no_delay,true); + if(sndbuf_!=-1) + asio_socket_->set_option(io::basic_socket::send_buffer_size,sndbuf_); + if(rcvbuf_!=-1) + asio_socket_->set_option(io::basic_socket::receive_buffer_size,rcvbuf_); booster::shared_ptr< ::cppcms::http::context> cnt(new ::cppcms::http::context(api_)); api_.reset(); cnt->run(); @@ -152,6 +169,7 @@ namespace impl { booster::aio::acceptor acceptor_; bool stopped_; bool tcp_; + int sndbuf_,rcvbuf_; Factory factory_; }; diff --git a/private/cgi_api.h b/private/cgi_api.h index f2f7093..505b896 100644 --- a/private/cgi_api.h +++ b/private/cgi_api.h @@ -58,6 +58,8 @@ namespace cgi { #ifndef CPPCMS_WIN32 virtual booster::shared_ptr accept(int fd) = 0; #endif + virtual void sndbuf(int v) = 0; + virtual void rcvbuf(int v) = 0; virtual void stop() = 0; virtual ~acceptor(){} }; diff --git a/src/service.cpp b/src/service.cpp index 78b7211..8124ec4 100644 --- a/src/service.cpp +++ b/src/service.cpp @@ -768,6 +768,8 @@ std::auto_ptr service::setup_acceptor(json::value c std::string api=v.get("api"); std::string socket=v.get("socket",""); + int sndbuf = v.get("sndbuf",-1); + int rcvbuf = v.get("rcvbuf",-1); std::string ip; int port=0; @@ -835,6 +837,9 @@ std::auto_ptr service::setup_acceptor(json::value c if(!a.get()) throw cppcms_error("Unknown api: " + api); + a->sndbuf(sndbuf); + a->rcvbuf(rcvbuf); + return a; }