aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/Networking/Socket.h33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index 9c3ec180b0a..38d88e3592c 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -34,13 +34,40 @@ using boost::asio::ip::tcp;
template<class T, class PacketType>
class Socket : public std::enable_shared_from_this<T>
{
+ typedef typename std::conditional<std::is_pointer<PacketType>::value, PacketType, PacketType const&>::type WritePacketType;
+
public:
Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _headerSize(headerSize) { }
virtual void Start() = 0;
- boost::asio::ip::address GetRemoteIpAddress() const { return _socket.remote_endpoint().address(); };
- uint16 GetRemotePort() const { return _socket.remote_endpoint().port(); }
+ boost::asio::ip::address GetRemoteIpAddress() const
+ {
+ boost::system::error_code error;
+ auto ep = _socket.remote_endpoint(error);
+
+ if (error)
+ {
+ TC_LOG_DEBUG("network", "Socket::GetRemoteIpAddress: errored with: %i (%s)", error.value(), error.message().c_str());
+ return boost::asio::ip::address();
+ }
+ else
+ return ep.address();
+ }
+
+ uint16 GetRemotePort() const
+ {
+ boost::system::error_code error;
+ auto ep = _socket.remote_endpoint(error);
+
+ if (error)
+ {
+ TC_LOG_DEBUG("network", "Socket::GetRemotePort: errored with: %i (%s)", error.value(), error.message().c_str());
+ return 0;
+ }
+ else
+ return ep.port();
+ }
void AsyncReadHeader()
{
@@ -68,7 +95,7 @@ public:
}
}
- void AsyncWrite(PacketType const& data)
+ void AsyncWrite(WritePacketType data)
{
boost::asio::async_write(_socket, boost::asio::buffer(data), std::bind(&Socket<T, PacketType>::WriteHandler, this->shared_from_this(), std::placeholders::_1,
std::placeholders::_2));