2011-09-15 23 views
0

vb6でwinsockコントロールを使用して、Webサービスの可用性をチェックしています。 投稿要求を行い、応答を取得し、応答ヘッダを解析して応答コードを確認します。VB6 winsock応答待ち

応答は複数のパケットで到着します。

' this event occurs when data is arriving via winsock 
Private Sub wsTCP_DataArrival(ByVal bytesTotal As Long) 
    Dim strResponse As String   
    wsTCP.GetData strResponse, vbString, bytesTotal 
    strResponse = FormatLineEndings(strResponse) 

    ' we append this to the response box becuase data arrives 
    ' in multiple packets 
    response = response & strResponse   
End Sub 

私の問題は、実行を続行するために応答コードをチェックするまで待つ必要があることです。

タイマーを使用せずにこれを行う方法はありますか?

おかげで、 アレックス

は、すべての後に、タイマーを使用することにしました。

+1

ちょっとメモ... 'response = response&strResponse'は、狂ったような文字列を再割り当てするため、パフォーマンスにはあまり適していません。パフォーマンスや大きなレスポンスが予想される場合は、すべてのDataArrivalでサイズを変更する必要のない大きなバッファを割り当て、正しいオフセットでデータフレームを挿入することをお勧めします。 – tcarvin

+0

+1良いadivice ...別の呼び出しがあるのでstrResponseを使用していますstrResponse = FormatLineEndings(strResponse) – thedev

答えて

3

データを受け取るたびに、バッファに追加して処理/解析します。 ブロッキングソケットを使用する必要があり、到着時に反応できることを意味します。 例については、ネットワークプロトコルのthis articleを参照してください。

1

リクエストを送信したときに[キャンセル]ボタンなどを除いてUIのコントロールを無効にします。応答が完了したら、UIを有効にしてDataArrival内の結果を表示し、それ以外の場合は「続行」することができます。

実際にVB6プログラムでソケットをブロックしたくない場合は、ワーカースレッドを利用できないため、Windowsのプログラミングパラダイム全体が損なわれます。ワーカースレッドであっても、UIスレッドを「サスペンド」するのと同じ方法でコーディングすることになりますので、そこでの損失はありません。

タイマーは、要求のタイムアウトを処理する最も簡単な方法です。