Winsock 15个连接同时变得不稳定

Winsock 15 connections at the same time becomes unstable

我的服务器正在端口 1234 上侦听传入连接,我制作了一个套接字数组,我正在遍历该数组以查找已经空闲的套接字 (Closed = 0) 增加该数组以容纳新的传入套接字如果套接字数组中没有可用的空闲套接字,这将是稍后套接字的索引,以单独标识每个连接。不确定这是否是一个好方法,但它工作正常且稳定,直到我试图通过同时打开大约 15 个客户端来对我的服务器施加压力。我面临的问题是一些客户端应用程序连接超时,服务器在同时处理这些多个连接时变得不稳定。对于从服务器接收到的每个连接事件,我不会仅发送 20 个字节的大量数据。我试图在 listen 调用中增加 Backlog 值,但这也无济于事。 我必须等待更长的时间才能连接这些客户端。但他们最终联系在一起。并且服务器稍后仍会响应新连接(例如,如果我关闭所有这些客户端应用程序或打开一个新的客户端应用程序,它将立即连接)。这些连接也保持打开状态,我不会从客户端关闭套接字。

我正在使用 CSocketPlus Class

连接请求事件

Private Sub Sockets_ConnectionRequest(ByVal Index As Variant, ByVal requestID As Long)
Dim sckIndex As Integer

sckIndex = GetFreeSocketIndex(Sockets)
Sockets.Accept sckIndex, requestID
End Sub


Function GetFreeSocketIndex(Sockets As CSocketPlus) As Integer
Dim i As Integer, blnFound As Boolean
If Sockets.ArrayCount = 1 Then 'First we check if we have not loaded any arrays yet (First connector)
Sockets.ArrayAdd 1
GetFreeSocketIndex = 1
ReDim UserInfo(1)
Exit Function

 Else
'Else we loop through all arrays and find a free (Not connected one)

 For i = 1 To Sockets.ArrayCount - 1

If Sockets.State(i) <> sckConnected Then
'Found one use it
blnFound = True
Sockets.CloseSck i

GetFreeSocketIndex = i
If UBound(UserInfo) < i Then
    ReDim Preserve UserInfo(i)
End If
Exit Function
    End If

 Next i

 'Didn't find any load one and use it
  If blnFound = False Then
    Sockets.ArrayAdd i
    Sockets.CloseSck i
    GetFreeSocketIndex = i
    ReDim Preserve UserInfo(i)

  End If
    End If




End Function

有谁知道为什么同时发生多个连接时会出现性能问题?为什么服务器响应变慢了?

是什么让服务器接受速度更快?

我也试过不接受连接,即不在连接请求事件上调用接受,但仍然是同样的问题。

编辑:我试图在 FD_ACCEPT 事件上放置一个调试变量来打印套接字号的输出 CSocket class 并且似乎 WndProc 在大量连接的情况下延迟到 post 消息。

好的,问题似乎出在我的连接上。我已将我的服务器移动到我的 RDP,它具有 250Mbps 的下载速度和 200Mbps 的上传速度,它似乎在那里工作得很好。用 100 个客户端测试它建立了连接,每个客户端都立即连接!。想知道为什么我的家庭连接是 40/40 Mbps 时会遇到这样的问题...嗯。有谁知道为什么会这样?

编辑:似乎是路由器选项!

启用防火墙
启用 DoS 保护

禁用防火墙(仅用于测试目的),一切正常!

所以基本上路由器认为存在某种dos攻击。 所以会拖慢车速。