11 #include <boost/bind.hpp>
12 #include <boost/enable_shared_from_this.hpp>
14 using namespace boost::asio::local;
27 : socket_(io_service.get_io_service()) {
45 void asyncConnect(
const stream_protocol::endpoint& endpoint,
61 const boost::system::error_code& ec);
72 void asyncSend(
const void* data,
const size_t length,
84 void doSend(
const boost::asio::const_buffers_1& buffer,
104 const boost::asio::const_buffers_1& buffer,
105 const boost::system::error_code& ec,
117 void asyncReceive(
void* data,
const size_t length,
128 void doReceive(
const boost::asio::mutable_buffers_1& buffer,
147 const boost::asio::mutable_buffers_1& buffer,
148 const boost::system::error_code& ec,
165 UnixDomainSocketImpl::asyncConnect(
const stream_protocol::endpoint& endpoint,
167 auto local_handler = boost::bind(&UnixDomainSocketImpl::connectHandler, shared_from_this(),
169 socket_.async_connect(endpoint, local_handler);
174 const boost::system::error_code& ec) {
180 if (ec.value() == boost::asio::error::in_progress) {
181 remote_handler(boost::system::error_code());
188 UnixDomainSocketImpl::asyncSend(
const void* data,
const size_t length,
190 doSend(boost::asio::buffer(data, length), handler);
194 UnixDomainSocketImpl::doSend(
const boost::asio::const_buffers_1& buffer,
196 auto local_handler = boost::bind(&UnixDomainSocketImpl::sendHandler, shared_from_this(),
197 handler, buffer, _1, _2);
198 socket_.async_send(buffer, local_handler);
203 const boost::asio::const_buffers_1& buffer,
204 const boost::system::error_code& ec,
210 if ((ec.value() == boost::asio::error::would_block) ||
211 (ec.value() == boost::asio::error::try_again)) {
212 doSend(buffer, remote_handler);
215 remote_handler(ec, length);
220 UnixDomainSocketImpl::asyncReceive(
void* data,
const size_t length,
222 doReceive(boost::asio::buffer(data, length), handler);
226 UnixDomainSocketImpl::doReceive(
const boost::asio::mutable_buffers_1& buffer,
228 auto local_handler = boost::bind(&UnixDomainSocketImpl::receiveHandler, shared_from_this(),
229 handler, buffer, _1, _2);
230 socket_.async_receive(buffer, 0, local_handler);
235 const boost::asio::mutable_buffers_1& buffer,
236 const boost::system::error_code& ec,
242 if ((ec.value() == boost::asio::error::would_block) ||
243 (ec.value() == boost::asio::error::try_again)) {
244 doReceive(buffer, remote_handler);
247 remote_handler(ec, length);
252 UnixDomainSocketImpl::shutdown() {
253 boost::system::error_code ec;
254 static_cast<void>(socket_.shutdown(stream_protocol::socket::shutdown_both, ec));
261 UnixDomainSocketImpl::cancel() {
262 boost::system::error_code ec;
263 static_cast<void>(socket_.cancel(ec));
270 UnixDomainSocketImpl::close() {
271 boost::system::error_code ec;
272 static_cast<void>(socket_.close(ec));
278 UnixDomainSocket::UnixDomainSocket(
IOService& io_service)
284 #if BOOST_VERSION < 106600
285 return (impl_->socket_.native());
287 return (impl_->socket_.native_handle());
298 boost::system::error_code ec;
299 impl_->socket_.connect(stream_protocol::endpoint(path.c_str()), ec);
307 impl_->asyncConnect(stream_protocol::endpoint(path.c_str()), handler);
312 boost::system::error_code ec;
313 size_t res = boost::asio::write(impl_->socket_,
314 boost::asio::buffer(data, length),
315 boost::asio::transfer_all(),
326 impl_->asyncSend(data, length, handler);
331 boost::system::error_code ec;
332 size_t res = impl_->socket_.receive(boost::asio::buffer(data, length), 0, ec);
342 impl_->asyncReceive(data, length, handler);
360 boost::asio::local::stream_protocol::socket&
362 return (impl_->socket_);