aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-03-12 19:43:07 +0100
committerShauren <shauren.trinity@gmail.com>2016-03-12 19:44:06 +0100
commit9b5adcc6fc21bcee740f7117aa3012baf731c88d (patch)
tree4115282f5f2158fca48c6f4cb6b0e6b2e7ca0c32 /src
parentcebe6122ad3305243e56e17f18b8c374db789862 (diff)
Core/Networking: Fixed DelayedCloseSocket when compiled without TC_SOCKET_USE_IOCP (linux)
Closes #16769 (cherry picked from commit 0daba931ef8e57777ed98a94a0a51c0690ba3d9c)
Diffstat (limited to 'src')
-rw-r--r--src/server/shared/Networking/Socket.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index d1ba7f49aa4..c0a08de87e2 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -55,11 +55,11 @@ public:
virtual bool Update()
{
- if (!IsOpen())
+ if (_closed)
return false;
#ifndef TC_SOCKET_USE_IOCP
- if (_isWritingAsync || _writeQueue.empty())
+ if (_isWritingAsync || (_writeQueue.empty() && !_closing))
return true;
for (; HandleQueue();)
@@ -144,6 +144,15 @@ protected:
return false;
}
+ void SetNoDelay(bool enable)
+ {
+ boost::system::error_code err;
+ _socket.set_option(tcp::no_delay(enable), err);
+ if (err)
+ TC_LOG_DEBUG("network", "Socket::SetNoDelay: failed to set_option(boost::asio::ip::tcp::no_delay) for %s - %d (%s)",
+ GetRemoteIpAddress().to_string().c_str(), err.value(), err.message().c_str());
+ }
+
private:
void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes)
{
@@ -187,9 +196,6 @@ private:
bool HandleQueue()
{
- if (!IsOpen())
- return false;
-
if (_writeQueue.empty())
return false;
@@ -206,11 +212,15 @@ private:
return AsyncProcessQueue();
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return false;
}
else if (bytesSent == 0)
{
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return false;
}
else if (bytesSent < bytesToSend) // now n > 0
@@ -220,6 +230,8 @@ private:
}
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return !_writeQueue.empty();
}