私のサーバーは着信接続のためにポート1234をリッスンしています。ソケットの配列を作成しました。その配列をループして、すでに空いているソケット(Closed = 0)ソケット配列で使用可能な空きソケットがない場合は、新しい着信ソケットを保持する配列。これは後で各接続のみを識別するソケットのインデックスになります。それが良いアプローチであるかどうかは分かりませんが、同時に開かれた約15人のクライアントが私のサーバーにストレスを加えようとするまで、正常に動作し、安定しています。私が直面している問題は、クライアントアプリケーションの中に接続タイムアウトが発生し、同時に複数の接続を処理するサーバーが不安定になることです。私は多くのデータをサーバーから受信した各接続イベントで20バイトしか送信しません。私はバックログの値を増やそうとしましたはを聴いていますが、それでも役に立たなかった。 私はそれらのクライアントが接続するのに時間がかかります。しかし、彼らは結局結ぶ。また、サーバーは新しい接続に後で応答します(たとえば、それらのクライアントアプリケーションをすべて閉じるか、新しいクライアントアプリケーションを開くとすぐに接続します)。また、これらの接続は開いたままで、私はクライアント側からソケットを閉じません。複数の接続が同時に発生したときにパフォーマンスの問題があり、なぜ私はCSocketPlusクラス同時にWinsock 15の接続が不安定になる
接続要求イベント
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
を使用しています
誰でも知っていますか?なぜサーバーは応答が遅くなるのですか?
何がサーバをより早く受け入れるのですか?
私は接続を受け入れないようにしようとしました。つまり、接続要求イベントで受け入れを呼び出すのではなく、同じ問題です。
編集:私はのCSocketクラスのFD_ACCEPTイベントにソケット番号の出力を印刷するには、デバッグ変数を置くことを試みたが、のWndProcをした場合にメッセージを投稿するために遅らせているようです多くの接続。