2012-11-28 220 views
0

使用Visual Basic 6.0,我正在與Web服務器進行Winsock HTTP連接,該連接發送數據並在之後立即關閉。 (連接:保持活躍,沒有做任何好與此服務器)從套接字關閉後從套接字讀取數據

這裏有一塊我的代碼:

sck.SendData "GET /? HTTP/1.1" & vbNewLine & _ 
      "Host: example.org" & vbNewLine & _ 
      "Connection: keep-alive" & vbNewLine & vbNewLine 


'// Wait for full Data: 
Dim DATA As String 
While (Not isEOF(DATA)) And sck.State = sckConnected 
    If sck.State = sckConnected Then sck.PeekData DATA 
    Sleep 10: DoEvents 
Wend 

If sck.State <> sckConnected Then 
    '// When this Fires, my data is missing the 25% of it's rest. 
    '// It is received corectly acording to Wireshark, but Winsock 
    '// closes the socket befor I can get the rest to the DATA variable. 
    MsgBox "This happends randomly 10% of the times.", vbInformation 
End If 

Clipboard.Clear 
Clipboard.SetText DATA 
Msgbox DATA 
sck.Close 

的isEOF()函數做一些檢查的東西,看看數據是否充分並準備就緒(閱讀內容長度,</html>標記或空字符)。 不需要在這裏發佈,因爲它很大,這不是問題,相信我。

當您使用:sck.GetDatasck.PeekData來關閉套接字時,會出現錯誤。那麼我怎樣在封閉後從套接字中獲取數據呢?

這裏的關鍵是,10%的時間,Winsock關閉套接字befor我可以得到其餘的數據。 我嘗試了一切來解決這個問題(使用事件處理程序,GetData而不是PeekData等),但我仍然隨機獲取與要連接的Web服務器相同的錯誤。

什麼是正確的方式使用Winsock corectly GET和等待數據? 我在這段代碼中做了什麼錯誤?

+2

解釋歐比旺:「使用事件,盧克!這不是你正在尋找的QBasic。」 – Bob77

回答

0

你可以試試下面的代碼嗎?

'1 form with : 
' 1 winsock control : name=Winsock1 
' 1 command button : name=Command1 
Option Explicit 

Private Sub Command1_Click() 
    With Winsock1 
    .Connect "<your server>", <your port> 
    Do 
     DoEvents 
    Loop Until .State = sckConnected 
    .SendData <your command> 
    End With 'Winsock1 
End Sub 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 
    Dim strData As String 
    Winsock1.GetData strData 
    ProcessData strData 
End Sub 

Private Sub ProcessData(strData As String) 
    Static strTotal As String 
    strTotal = strTotal & strData 
    If IsComplete(strTotal) Then 'your check to see if data is complete 
    Winsock1.Close 
    End If 
End Sub 

我只跑了幾次,從來沒有錯過,而retreiving大量的數據(包括幾個DataArrival事件事件之前的數據是完整的)

也一定要做好其他事情的任何數據在ProcessData過程中的某處,當然在做完你的事情之後清空strTotal :)

0

你的問題表現出一些誤解。

  1. 的Winsock 從未關閉,除非你關閉它的插座。如果你遇到一個封閉的插座,關閉它。

  2. 如果同行關閉插座,構成連接關閉。但是,所有對等方已排隊發送的數據仍將被髮送,並且您仍然會收到它,之前的可以接收VB中的任何EOS指示。然後你將收到EOS,你的應該關閉你的插座。