現在、winsockコントロールを使用したサーバー側のソフトを作っています。
最大1024台のクライアントを接続できる仕様になっておりまして、
1024台接続した時の動作(負荷)を確認したいのですが、
実際1024台のクライアントを用意し、接続することは現実的に無理です。
擬似的に複数のクライアントが接続している状況を作り出したいのですが、
何か良い方法はありますでしょうか?
TCPでしょうか?
それなら1024個の論理接続を作ればいいだけなのでは?
ガッさん、早速のアドバイスありがとうございます。
お手数ですが、論理接続というのを具体的に教えて頂けないでしょうか?
TCPなどの接続を言います。
・単純に1024個のコネクションを作って動作検証すればいいのでは?
ということです。
(しかしこの場合、サーバ側のソフトの問題よりも
サーバ側で内部的に使っているWinsockコントロールが耐えられるかどうかのテストになる予感がしますが)
PC1個で10個のクライアントソフトを起動すれば100台で1000接続できますね。
PC1個で100個のクライアントソフトを起動すれば10台で1000接続できますね。
単純な算数です
こう言うのは最後にはリソースとの戦いになるのだが、
1台のコンピューターでチェックが出来ないわけではない。
2台コンピューターがあればサーバーのチェックは十分。
1台でやる場合は、wsClient、wsServerの2つのWinsockをindex=0で置いて、
下のコードでWinsockNoの値を増やしていく。
私の環境だと300接続位でかなり重くなるが....
実際はサーバー側のコンピューターにはクライアントのインスタンスが
たくさん出来ることは無いのであるが、このくらいの過負荷に耐えられないと、
とてもほんちゃんには使えない。
Const WinsockNo = 100
Private Sub Form_Load()
Dim i As Integer
'クライアントの接続要求受け付けサーバー
wsServer(0).LocalPort = 1001
wsServer(0).Listen
'複数のクライアント作成
For i = 1 To WinsockNo
Load wsClient(i)
List1.AddItem "LoadClient:" & i
DoEvents
Next
End Sub
Private Sub Command1_Click()
Dim i As Integer
'複数のクライアントから接続要求を出す
For i = 0 To WinsockNo
wsClient(i).Connect "172.18.12.111", 1001
List1.AddItem "ConectRequest:" & i
DoEvents
Next
End Sub
Private Sub Command2_Click()
Dim i As Integer
'複数のクライアントからデーターを送る
For i = 0 To WinsockNo
wsClient(i).SendData "SendFromClient:" & Str(i)
List1.AddItem "SendDataFrom:" & i
DoEvents
Next
End Sub
Private Sub wsServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Static i As Integer
'接続要求分のサーバー接続の作成
Load wsServer(i + 1)
wsServer(i + 1).Accept requestID
i = i + 1
List1.AddItem "ConnectAccept:" & i
DoEvents
End Sub
Private Sub wsServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim s As String
'サーバーに送られたデーターの処理
wsServer(Index).GetData s
List1.AddItem "DataArriveto" & Index & ":" & s
'クライアントのデーター受付処理は省略
wsServer(Index).SendData "accept"
DoEvents
End Sub
あ、Winsockコントロールといえばこういうのもありますので、注意です。
http://support.microsoft.com/default.aspx?scid=kb;ja;409932
GUIでリソースを食うので
PC1台、100クライアント起動するのが厳しいです。
私は、シミュレータを作成して検証しましたよ。
1台300スレッドで5台とか
>擬似的に複数のクライアントが接続している状況を作り出したいのですが、
>何か良い方法はありますでしょうか?
その状況に接続アドレスが含まれてると多少難しくなります。
VB6で作っているのですが、あるところの情報によりますと
VB6+winsockでは複数クライアントのサーバーには
無理があるという話がありました。
皆さんの意見をお聞かせ下さい。
試す方法をいろいろ回答してもらっているんだから
まずは試して見たら?
VB6ではマルチスレッド処理ができないから
1つの接続で重い処理が走る場合、他の接続の処理が
できないので無理だといわれているのだと思いますが
それはあなたが作るソフトの仕様なので自分で検証
してください。
>VB6+winsockでは複数クライアントのサーバーには
>無理があるという話がありました。
面白いことを言いますね、サーバーアプリケーションを作成出来るコントロールが
複数のクライアントに対応していない等ということはありません。
クライアントが増えてきて処理が重くなるのは、WinSockにはなんの落ち度も
無いことで、単にハードウエアーの仕様がクライアント数に対応していない
だけのことです。
1024台のクライアントを想定しているようですが、まさか1024のクライアントが
一度に接続要求を出す訳ではないですよね、重要なのは何台のクライアントが
居るかではなく、同時に最大何台のクライアントが接続する可能性があるかという事と
サーバー側でどの様な処理が必要かということです。
たとえば、単にサーバーが現在の時刻を返すだけの処理でしたらマシンにも
よりますが100台位の接続は可能でしょう。
ツイート | ![]() |