0
votes

My server is listening on the port 1234 for incoming connections, i made an array of sockets and i am looping through that array looking for an already free sockets (Closed = 0) increasing that array to hold a new incoming sockets if no free socket available in the sockets array, This will be later the index to the sockets to identify each connection alone. Not sure if that is a good approach but it works fine and stable until i tried to stress my server with about 15 client opened at the same time. The problem i am facing is that some of the client apps gets connection time-out and the server becomes unstable handling those multiple connections at the same time. I am not sending much data only 20 bytes on each connect event received from the server. I have tried to increase the Backlog value on the listen call but that didn't help either. I have to wait longer for those clients to connect. But they connect eventually. And the server still responses to new connections later on (If i close all those clients apps for example or open a new client app it will connect immediatly). Also these connections stay open and i do not close socket from the client side.

I am using CSocketPlus Class

Connection request event

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

Does anyone know why there is a performance issues when multiple connections occur at the same time? why the server becomes slowly to response?

What makes the server to accept faster?

I have also tried to not accept the connection ie not calling accept on connection request event but still the same issue.

EDIT: I have tried to put a debug variable to print the output of socket number on the FD_ACCEPT event on the CSocket class and it seems that WndProc is delaying to post the messages in case of a lot of connections.

1

1 Answers

0
votes

Ok the problem seems to be from my connection. I have moved my Server to my RDP which has 250Mbps Download speed with 200Mbps Upload speed and it seems to work very well there. Tested it with 100 client made a connection and every one of them connected immediatly!. Wonder why i have such issues where my home connection is 40/40 Mbps...hmmm. Anyone knows why that happen?

Edit: Seems to be the Router option!

Enable Firewall
Enable DoS protection

Disabled the firewall (just for testing purposes) and everything works flawlessly!

So basically the router is thinking that there is some kind of dos attack. So it will slow down the traffic.