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);