diff --git a/Source/Engine/Platform/Base/NetworkBase.cpp b/Source/Engine/Platform/Base/NetworkBase.cpp index a121f1b66..757b550f1 100644 --- a/Source/Engine/Platform/Base/NetworkBase.cpp +++ b/Source/Engine/Platform/Base/NetworkBase.cpp @@ -82,6 +82,16 @@ bool NetworkBase::GetSocketFromGroup(NetworkSocketGroup& group, uint32 index, Ne return true; } +void NetworkBase::RemoveSocketFromGroup(NetworkSocketGroup& group, uint32 index) +{ + +} + +bool NetworkBase::RemoveSocketFromGroup(NetworkSocketGroup& group, NetworkSocket& socket) +{ + return true; +} + void NetworkBase::ClearGroup(NetworkSocketGroup& group) { group.Count = 0; diff --git a/Source/Engine/Platform/Base/NetworkBase.h b/Source/Engine/Platform/Base/NetworkBase.h index fb12e56ce..066983de8 100644 --- a/Source/Engine/Platform/Base/NetworkBase.h +++ b/Source/Engine/Platform/Base/NetworkBase.h @@ -236,6 +236,21 @@ public: /// The returned socket. /// Returns true on error, otherwise false. static bool GetSocketFromGroup(NetworkSocketGroup& group, uint32 index, NetworkSocket* socket); + + /// + /// Removes the socket at the specified index. + /// + /// The group. + /// The index. + static void RemoveSocketFromGroup(NetworkSocketGroup& group, uint32 index); + + /// + /// Removes the socket if present. + /// + /// The group. + /// The socket. + /// Returns true if the socket is not found, otherwise false. + static bool RemoveSocketFromGroup(NetworkSocketGroup& group, NetworkSocket& socket); /// /// Clears the socket group. diff --git a/Source/Engine/Platform/Win32/Win32Network.cpp b/Source/Engine/Platform/Win32/Win32Network.cpp index 3c24110fd..90ac4e703 100644 --- a/Source/Engine/Platform/Win32/Win32Network.cpp +++ b/Source/Engine/Platform/Win32/Win32Network.cpp @@ -353,12 +353,21 @@ int32 Win32Network::AddSocketToGroup(NetworkSocketGroup& group, NetworkSocket& s { if (group.Count >= SOCKGROUP_MAXCOUNT) return -1; + pollfd pollinfo; pollinfo.fd = *(SOCKET*)socket.Data; pollinfo.events = POLLRDNORM | POLLWRNORM; - *(pollfd*)&group.Data[group.Count * SOCKGROUP_ITEMSIZE] = pollinfo; - group.Count++; - return group.Count - 1; + + for(int i = 0; i < SOCKGROUP_MAXCOUNT; i++) + { + if (((pollfd*)&group.Data[i * SOCKGROUP_ITEMSIZE])->fd == -1) + { + *(pollfd*)&group.Data[i * SOCKGROUP_ITEMSIZE] = pollinfo; + group.Count++; + return i; + } + } + return -1; } bool Win32Network::GetSocketFromGroup(NetworkSocketGroup& group, uint32 index, NetworkSocket* socket) @@ -379,6 +388,29 @@ bool Win32Network::GetSocketFromGroup(NetworkSocketGroup& group, uint32 index, N return false; } +void Win32Network::RemoveSocketFromGroup(NetworkSocketGroup& group, uint32 index) +{ + if (((pollfd*)&group.Data[index * SOCKGROUP_ITEMSIZE])->fd != -1) + { + ((pollfd*)&group.Data[index * SOCKGROUP_ITEMSIZE])->fd = -1; + group.Count--; + } +} + +bool Win32Network::RemoveSocketFromGroup(NetworkSocketGroup& group, NetworkSocket& socket) +{ + for(int i = 0; i < SOCKGROUP_MAXCOUNT; i++) + { + if (((pollfd*)&group.Data[i * SOCKGROUP_ITEMSIZE])->fd == *(SOCKET*)&socket.Data) + { + ((pollfd*)&group.Data[i * SOCKGROUP_ITEMSIZE])->fd = -1; + group.Count--; + return false; + } + } + return true; +} + void Win32Network::ClearGroup(NetworkSocketGroup& group) { group.Count = 0; diff --git a/Source/Engine/Platform/Win32/Win32Network.h b/Source/Engine/Platform/Win32/Win32Network.h index 578c7cee2..060cbde32 100644 --- a/Source/Engine/Platform/Win32/Win32Network.h +++ b/Source/Engine/Platform/Win32/Win32Network.h @@ -26,6 +26,8 @@ public: static bool GetSocketState(NetworkSocketGroup& group, uint32 index, NetworkSocketState& state); static int32 AddSocketToGroup(NetworkSocketGroup& group, NetworkSocket& socket); static bool GetSocketFromGroup(NetworkSocketGroup& group, uint32 index, NetworkSocket* socket); + static void RemoveSocketFromGroup(NetworkSocketGroup& group, uint32 index); + static bool RemoveSocketFromGroup(NetworkSocketGroup& group, NetworkSocket& socket); static void ClearGroup(NetworkSocketGroup& group); static int32 WriteSocket(NetworkSocket socket, byte* data, uint32 length, NetworkEndPoint* endPoint = nullptr); static int32 ReadSocket(NetworkSocket socket, byte* buffer, uint32 bufferSize, NetworkEndPoint* endPoint = nullptr);