From 81221fbf0b13267edade5837a3227c9bea62662d Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Nov 2015 13:19:21 +0100 Subject: [PATCH 1/3] Network/TcpClient: Fix LowDelay Former-commit-id: 70fc4224ae7f8913e27a3a3cf234500db262f73c --- src/Nazara/Network/TcpClient.cpp | 4 ++-- src/Nazara/Network/Win32/SocketImpl.cpp | 19 +++++++++++++++++++ src/Nazara/Network/Win32/SocketImpl.hpp | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index ab825bb89..745c23fd6 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -75,7 +75,7 @@ namespace Nz if (m_isLowDelayEnabled != lowDelay) { - SocketImpl::SetBlocking(m_handle, lowDelay, &m_lastError); + SocketImpl::SetNoDelay(m_handle, lowDelay, &m_lastError); m_isLowDelayEnabled = lowDelay; } } @@ -238,7 +238,7 @@ namespace Nz SocketState newState = SocketImpl::Connect(m_handle, m_peerAddress, msTimeout, &m_lastError); NazaraAssert(newState != SocketState_Connecting, "Invalid internal return"); - // Prevent valid peer adddress in non-connected state + // Prevent valid peer address in non-connected state if (newState == SocketState_NotConnected) m_peerAddress = IpAddress::Invalid; diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index 83ffaf55c..ecb9b678b 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -534,6 +534,25 @@ namespace Nz return true; } + bool SocketImpl::SetNoDelay(SocketHandle handle, bool nodelay, SocketError* error) + { + NazaraAssert(handle != InvalidHandle, "Invalid handle"); + + BOOL option = nodelay; + if (setsockopt(handle, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) + { + if (error) + *error = TranslateWSAErrorToSocketError(WSAGetLastError()); + + return false; //< Error + } + + if (error) + *error = SocketError_NoError; + + return true; + } + SocketError SocketImpl::TranslateWSAErrorToSocketError(int error) { switch (error) diff --git a/src/Nazara/Network/Win32/SocketImpl.hpp b/src/Nazara/Network/Win32/SocketImpl.hpp index 9eb2c11ff..f1c94e737 100644 --- a/src/Nazara/Network/Win32/SocketImpl.hpp +++ b/src/Nazara/Network/Win32/SocketImpl.hpp @@ -48,6 +48,7 @@ namespace Nz static bool SetBlocking(SocketHandle handle, bool blocking, SocketError* error = nullptr); static bool SetKeepAlive(SocketHandle handle, bool enabled, UInt64 msTime, UInt64 msInterval, SocketError* error = nullptr); + static bool SetNoDelay(SocketHandle handle, bool nodelay, SocketError* error = nullptr); static SocketError TranslateWSAErrorToSocketError(int error); static int TranslateNetProtocolToAF(NetProtocol protocol); From f28e1a7d9b42b521b7a66c77519f21860c3a9710 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Nov 2015 13:35:46 +0100 Subject: [PATCH 2/3] Network/UdpSocket: Add broadcasting option Former-commit-id: bde428efc5e9c77cf3e64ec04d58d72613f1d8de --- include/Nazara/Network/UdpSocket.hpp | 5 +++++ include/Nazara/Network/UdpSocket.inl | 5 +++++ src/Nazara/Network/UdpSocket.cpp | 12 ++++++++++++ src/Nazara/Network/Win32/SocketImpl.cpp | 19 +++++++++++++++++++ src/Nazara/Network/Win32/SocketImpl.hpp | 1 + 5 files changed, 42 insertions(+) diff --git a/include/Nazara/Network/UdpSocket.hpp b/include/Nazara/Network/UdpSocket.hpp index 4730f4793..e6577bec7 100644 --- a/include/Nazara/Network/UdpSocket.hpp +++ b/include/Nazara/Network/UdpSocket.hpp @@ -26,10 +26,14 @@ namespace Nz inline bool Create(NetProtocol protocol); + void EnableBroadcasting(bool broadcasting); + inline IpAddress GetBoundAddress() const; inline UInt16 GetBoundPort() const; inline SocketState GetState() const; + inline bool IsBroadcastingEnabled() const; + unsigned int QueryMaxDatagramSize(); bool Receive(void* buffer, std::size_t size, IpAddress* from, std::size_t* received); @@ -42,6 +46,7 @@ namespace Nz IpAddress m_boundAddress; SocketState m_state; + bool m_isBroadCastingEnabled; }; } diff --git a/include/Nazara/Network/UdpSocket.inl b/include/Nazara/Network/UdpSocket.inl index a77aeca3b..d412c45bc 100644 --- a/include/Nazara/Network/UdpSocket.inl +++ b/include/Nazara/Network/UdpSocket.inl @@ -61,6 +61,11 @@ namespace Nz { return m_state; } + + inline bool UdpSocket::IsBroadcastingEnabled() const + { + return m_isBroadCastingEnabled; + } } #include diff --git a/src/Nazara/Network/UdpSocket.cpp b/src/Nazara/Network/UdpSocket.cpp index b73ef8da2..6bece4f28 100644 --- a/src/Nazara/Network/UdpSocket.cpp +++ b/src/Nazara/Network/UdpSocket.cpp @@ -26,6 +26,17 @@ namespace Nz return state; } + void UdpSocket::EnableBroadcasting(bool broadcasting) + { + NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Invalid handle"); + + if (m_isBroadCastingEnabled != broadcasting) + { + SocketImpl::SetBroadcasting(m_handle, broadcasting, &m_lastError); + m_isBroadCastingEnabled = broadcasting; + } + } + unsigned int UdpSocket::QueryMaxDatagramSize() { NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket hasn't been created"); @@ -73,6 +84,7 @@ namespace Nz void UdpSocket::OnOpened() { m_boundAddress = IpAddress::Invalid; + m_isBroadCastingEnabled = false; UpdateState(SocketState_NotConnected); } diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index ecb9b678b..5e1834e6b 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -509,6 +509,25 @@ namespace Nz return true; } + + bool SocketImpl::SetBroadcasting(SocketHandle handle, bool broadcasting, SocketError* error) + { + NazaraAssert(handle != InvalidHandle, "Invalid handle"); + + BOOL option = broadcasting; + if (setsockopt(handle, SOL_SOCKET, SO_BROADCAST, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) + { + if (error) + *error = TranslateWSAErrorToSocketError(WSAGetLastError()); + + return false; //< Error + } + + if (error) + *error = SocketError_NoError; + + return true; + } bool SocketImpl::SetKeepAlive(SocketHandle handle, bool enabled, UInt64 msTime, UInt64 msInterval, SocketError* error) { diff --git a/src/Nazara/Network/Win32/SocketImpl.hpp b/src/Nazara/Network/Win32/SocketImpl.hpp index f1c94e737..ad58c76f0 100644 --- a/src/Nazara/Network/Win32/SocketImpl.hpp +++ b/src/Nazara/Network/Win32/SocketImpl.hpp @@ -47,6 +47,7 @@ namespace Nz static bool SendTo(SocketHandle handle, const void* buffer, int length, const IpAddress& to, int* sent, SocketError* error); static bool SetBlocking(SocketHandle handle, bool blocking, SocketError* error = nullptr); + static bool SetBroadcasting(SocketHandle handle, bool broadcasting, SocketError* error = nullptr); static bool SetKeepAlive(SocketHandle handle, bool enabled, UInt64 msTime, UInt64 msInterval, SocketError* error = nullptr); static bool SetNoDelay(SocketHandle handle, bool nodelay, SocketError* error = nullptr); From b77c50fe58236a018336c0b5b853d4ff5f1e23bb Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Nov 2015 14:54:47 +0100 Subject: [PATCH 3/3] Network/TcpClient: Fix peer address not updated if Connect() fails Former-commit-id: 1c8f9d5e20f6266d40233e7ad0ecf7b12fee0127 --- src/Nazara/Network/TcpClient.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 745c23fd6..ed9842631 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -34,8 +34,7 @@ namespace Nz } SocketState state = SocketImpl::Connect(m_handle, remoteAddress, &m_lastError); - if (state != SocketState_NotConnected) - m_peerAddress = remoteAddress; + m_peerAddress = (state != SocketState_NotConnected) ? remoteAddress : IpAddress::Invalid; UpdateState(state); return state; @@ -109,7 +108,7 @@ namespace Nz if (error == SocketError_NoError) { - // No error yet, we're still connecting or connected, check that by connecting again + // No error yet, we're still connecting or connected, check that by calling Connect again return Connect(m_peerAddress); } else @@ -243,7 +242,7 @@ namespace Nz m_peerAddress = IpAddress::Invalid; UpdateState(newState); - return m_state == SocketState_Connected; + return newState == SocketState_Connected; } case SocketState_NotConnected: