Index: boost/asio/detail/reactive_socket_service.hpp =================================================================== --- boost/asio/detail/reactive_socket_service.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/detail/reactive_socket_service.hpp 2014-11-02 01:00:00.000000000 -0600 267c267,269 < flags, sender_endpoint.data(), &addr_len, ec); --- > flags, sender_endpoint.data(), &addr_len, > sender_endpoint.control(), sender_endpoint.control_size(), > ec); Index: boost/asio/detail/socket_ops.hpp =================================================================== --- boost/asio/detail/socket_ops.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/detail/socket_ops.hpp 2014-11-02 01:00:00.000000000 -0600 154c154,155 < std::size_t* addrlen, boost::system::error_code& ec); --- > std::size_t* addrlen, void* control, std::size_t controllen, > boost::system::error_code& ec); 158c159,160 < std::size_t* addrlen, boost::system::error_code& ec); --- > std::size_t* addrlen, void* control, std::size_t controllen, > boost::system::error_code& ec); Index: boost/asio/ip/detail/endpoint.hpp =================================================================== --- boost/asio/ip/detail/endpoint.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/ip/detail/endpoint.hpp 2014-11-02 01:00:00.000000000 -0600 79a80,120 > /// Get the underlying endpoint's first control header for recvfrom calls. > const struct cmsghdr* control_header_first() const > { > return CMSG_FIRSTHDR(control_.msg()); > } > > /// Get the underlying endpoint's next control header for recvfrom calls. > const struct cmsghdr* control_header_next(const cmsghdr* prev) const > { > return static_cast( > CMSG_NXTHDR(const_cast(control_.msg()), > const_cast(prev))); > } > > /// Get the underlying size of the endpoint's buffer used to store > /// control messages. > template > T control_msg_data(const struct cmsghdr* cmsg) const > { > return reinterpret_cast(CMSG_DATA(cmsg)); > } > > /// Get the underlying endpoint's control message given its header. > void* control_msg() const > { > return control_.msg()->msg_control; > } > > /// Get the underlying size of the endpoint's buffer used to store > /// control messages. > std::size_t control_size() const > { > return control_.msg()->msg_controllen; > } > > /// Set the size of the buffer used for storing control message. > void control_size(size_t size) > { > control_.allocate(size); > } > 127a169,198 > > // Space for control message for receive > struct control > { > control() > { > memset(&msg_, 0, sizeof(msghdr)); > } > ~control() > { > allocate(0); > } > void allocate(size_t sz) > { > if (msg_.msg_control) > delete [] (char*)msg_.msg_control; > if (sz == 0) > return; > size_t n = sz > sizeof(struct cmsghdr) ? sz : sizeof(struct cmsghdr)+128; > msg_.msg_control = new char[n]; > msg_.msg_controllen = n; > memset(msg_.msg_control, 0, n); > } > > const msghdr* msg() const { return &msg_; } > const cmsghdr* cmsg() const { return static_cast(msg_.msg_control); } > size_t cmsg_len() { return msg_.msg_controllen; } > private: > msghdr msg_; > } control_; Index: boost/asio/detail/win_iocp_socket_service.hpp =================================================================== --- boost/asio/detail/win_iocp_socket_service.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/detail/win_iocp_socket_service.hpp 2014-11-02 01:00:00.000000000 -0600 347c347 < flags, sender_endpoint.data(), &addr_len, ec); --- > flags, sender_endpoint.data(), &addr_len, NULL, 0, ec); Index: boost/asio/ip/basic_endpoint.hpp =================================================================== --- boost/asio/ip/basic_endpoint.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/ip/basic_endpoint.hpp 2014-11-02 01:00:00.000000000 -0600 156a157,195 > /// Get the underlying endpoint's first control header for recvfrom calls. > const struct cmsghdr* control_header_first() const > { > return impl_.control_header_first(); > } > > /// Get the underlying endpoint's next control header for recvfrom calls. > const struct cmsghdr* control_header_next(const cmsghdr* prev) const > { > return impl_.control_header_next(prev); > } > > /// Get the underlying size of the endpoint's buffer used to store > /// control messages. > template > T control_msg_data(const struct cmsghdr* cmsg) const > { > return impl_.control_msg_data(cmsg); > } > > /// Get the underlying endpoint's control message given its header. > void* control_msg() const > { > return impl_.control_msg(); > } > > /// Get the underlying size of the endpoint's buffer used to store > /// control messages. > std::size_t control_size() const > { > return impl_.control_size(); > } > > /// Set the size of the buffer used for storing control message. > void control_size(size_t size) > { > impl_.control_size(size); > } > Index: boost/asio/detail/impl/socket_ops.ipp =================================================================== --- boost/asio/detail/impl/socket_ops.ipp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/detail/impl/socket_ops.ipp 2014-11-02 01:00:00.000000000 -0600 819a820 > void* control, std::size_t controllen, 845a847,850 > if (controllen > 0) { > msg.msg_control = control; > msg.msg_controllen = controllen; > } 856c861,863 < std::size_t* addrlen, boost::system::error_code& ec) --- > std::size_t* addrlen, > void* control, std::size_t controllen, > boost::system::error_code& ec) 869c876 < s, bufs, count, flags, addr, addrlen, ec); --- > s, bufs, count, flags, addr, addrlen, control, controllen, ec); 918c925 < s, bufs, count, flags, addr, addrlen, ec); --- > s, bufs, count, flags, addr, addrlen, control, controllen, ec); Index: boost/asio/detail/reactive_socket_recvfrom_op.hpp =================================================================== --- boost/asio/detail/reactive_socket_recvfrom_op.hpp 2014-11-02 00:00:00.000000000 -0600 +++ boost/asio/detail/reactive_socket_recvfrom_op.hpp 2014-11-02 01:00:00.000000000 -0600 59a60 > o->sender_endpoint_.control_msg(), o->sender_endpoint_.control_size(),