我的服务器正在侦听端口1234上的传入连接,我做了一个套接字数组,我循环遍历该数组,寻找已经免费的套接字(Closed = 0),增加该数组以保存新的传入套接字,如果没有套接字数组中可用的空闲套接字,这将是套接字的索引,以便单独识别每个连接。不确定这是否是一个好的方法,但它工作正常和稳定,直到我试图压缩我的服务器与同时打开约15个客户端。我面临的问题是,某些客户端应用程序会因连接超时而导致服务器变得不稳定,同时处理这些多个连接。我在从服务器收到的每个连接事件上只发送20个字节的数据。我试图在监听电话上增加积压值,但这也没有帮助。 我必须等待更长时间才能连接这些客户端。但他们最终联系起来。并且服务器稍后仍会响应新连接(例如,如果我关闭所有这些客户端应用程序或打开一个新的客户端应用程序,它将立即连接)。这些连接也保持打开状态,我不会从客户端关闭套接字。
我正在使用 CSocketPlus 类
连接请求事件
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
当有多个连接同时发生时,有谁知道为什么存在性能问题?为什么服务器变得缓慢响应?
是什么让服务器更快地接受?
我也试图不接受连接,即不在连接请求事件上调用accept,但仍然是同样的问题。
编辑:我试图在 CSocket 类的 FD_ACCEPT 事件上放置一个调试变量来打印套接字号的输出,它似乎 WndProc 延迟发布消息,以防有大量连接。
答案 0 :(得分:0)
好的问题似乎来自我的联系。我已经将我的服务器移动到我的RDP,它具有250Mbps的下载速度和200Mbps的上传速度,它似乎在那里工作得非常好。用100个客户端进行测试,建立了连接,并且每个客户端都立即连接!不知道为什么我有这样的问题,我的家庭连接是40/40 Mbps ...嗯。谁知道为什么会这样?
编辑:似乎是路由器选项!
启用防火墙
启用DoS保护
禁用防火墙(仅用于测试目的),一切正常!
所以基本上路由器认为存在某种dos攻击。 所以它会减慢流量。