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