現在、ダイジェスト認証付きHTTPサーバ負荷ツールを作成しています。
ツールはSDIベースで親画面から子スレッドを複数作成し、
マルチスレッドでHTTPサーバへの接続を繰り返し行い、能力を評価します。
HTTPサーバへの接続は”CInternetSession”クラスを使用し、ダイジェスト
認証、ユーザ名、パスワードをセットし、接続しようとしているのですが、
子スレッドの”SendRequest”メソッドでのPOST送信中に別の子スレッドの
”GetHttpConnection”が動作してしまうと、サーバからの401応答後の
POSTユーザ名、パスワードが別子スレッドでセットしたユーザに書き換わ
ってしまいます。
オブジェクトがユニークで作成されているか調べましたが、問題なく
”GetHttpConnection”メソッドで書き換わっているとしか思えません。
GetHttpConnectionは一つのユーザしか定義できない仕様なのでしょうか?
WebApplicationStressTool(WAS)を作ろうとしていますね。
>> CInternetSession
問題があるなら、CSocketに立ち返って、プロトコルをキチンと
組み立ててみては。
CSocket を作ってダミーサーバを作ってIEがどのようなリクエスト
を送っているか確認してみるのもいいですね。
御回答ありがとうございます。
たしかにCSocketレベルからロジックを組めば、
ローカルデータベースでユーザを管理できるので、
動作にこの現象は発生しないし確実だと思います。
以前にbsd socketやCSockを使用したHTTPサーバとクライアント
も組んでいましたので作り込めば、出来ると思うのですが、今回は
時間の都合上このAPIを使用してしまいました。
GetHttpConnectionで共通エリアにユーザ情報を書き込んでいないかの
チェックを行なったのですが、最後まで追い切れませんでした。
リクエストプレイヤーのAPIであるため、複数オブジェクトを作成
したならば、通常別エリアに保持してもおかしくないと考えているのですが、
そうではないのでしょうか?
>> HTTPサーバとクライアントも組んでいました
結構できる方とお見受けしますので、
失礼な予想は立てられないのですが。
私の予想では CInternetSession の問題ではなく、
スレッド間のメモリ管理の問題ではないかと思いますが。
AfxBeginThread() ですよね。
>> AfxBeginThread()
はい、その通りです。
これでスレッドを立てています。
スレッド間メモリ管理の可能性は考慮していませんでした。
これから調査してみます。
調査結果遅れました。
メモリ周りを調べてみましたが、異常はありませんでした。
個別にオブジェクトが作成されているようです。
しかし、調査の結果、接続ユーザ確認用のAPIが用意されていることや、
SSL/TLS暗号化モジュールの仕様などから考えると
このAPI自体がマルチスレッドに対応していないのではないでしょうか?
今はセマフォによる排他制御をかけることで、この問題は一応回避しています。
>> このAPI自体がマルチスレッドに対応していないのではないでしょうか?
というかマルチユーザを抑制しているのかもしれませんね。
レジストリ書き換えか、ファイルか。
別プロセスでも同様なことが起こるならば、
このことは確定的ですね。
ツイート | ![]() |