2009-10-04 3 views
3

일부 파일을 다운로드하고 저장하기 위해 Winsock을 사용하려고합니다. 필자의 경우 2 개의 열이있는 MSHFlexGrid가 있습니다. 하나는 URL이고 다른 하나는 "path + filename"(파일이 저장되는 곳)입니다. 나는 다음 함수를 호출하는 모든 행을 반복하고 있습니다 :Winsock 다운로드 파일 - vb6

Public Function DownloadSock(ArqURL As String, ArqDestino As String) As Boolean 
'ArqURL is the file URL 
'ArqDestino is where the downloaded file is going to be stored, in my hard disc 

Dim arquivo() As Byte 
Dim ficheiroID As Integer 

ficheiroID = FreeFile 
On Error GoTo Trata_erro 
Open ArqDestino For Binary Access Write As #ficheiroID 


Me.Winsock1.Connect ArqURL, 80 
Me.Winsock1.GetData arquivo() 
Put #ficheiroID, , arquivo() 

Close #ficheiroID 

DownloadSock = True 


Exit Function 

Trata_erro: 

    MDIForm1.Text1 = MDIForm1.Text1 & "Error! " & Err.Number & Err.Description & " - " & Err.Source & " - URL: " & ArqURL & " - Destino: " & ArqDestino & vbNewLine 
    DownloadSock = False 

End Function 

나는이 오류를 받고 있어요을

40006 : 잘못된 프로토콜 또는 연결 요청 트랜잭션에 대한 상태 또는 요청

내가 뭘 잘못하고 있니?

감사합니다.

답변

2

Microsoft Support page을 확인 했습니까? Winsock 컨트롤에 버그가 있음을 나타내며 핫픽스가 도움이 될 수 있습니다.

시도하는 또 다른 것은 당신의 윈속 연결이 읽기/데이터를 전송하는 시도하기 전에 열려 있는지 확인하는 것입니다, 그리고 그것은 닫혀있는 경우, 새 연결 다시 :

if winsock.state=9 ' error state 
    winsock.close 
    while winsock.state<>0 ' closed state 
    doEvents 
    wend ' you need a while loop, because it doesn't close "immediately". 
end if 
' now you reopen it, or do whatever else you need 

당신은 또한 당신의 연결을 변경하는 것이 좋습니다를 코드는 다음과 같습니다.

With Winsock1 
     If .State <> sckClosed Then .Close 
     .RemoteHost = ArqURL 
     .RemotePort = 80 
     .Connect 
End With 

마지막으로 한 가지. Winsock 컨트롤 사용에 대해서는 this post을 확인하십시오.

+1

이 접근법은'Winsock.State'가 변경되기를 기다리는'DoEvents'를 호출 할 필요가 없도록 모든 것을 비동기로 유지합니다. 특히 DoEvents를 사용하는 코드로 인해 디버그하기 힘든 문제를 처리 한 후 DoEvents를주의해야합니다. 따라서 구현하기 쉬운 방법처럼 보일지라도 모든 것을 희생해서 피하는 경향이 있습니다. busy-wait 루프. –

1

나는 Winsock 컨트롤의 힘을 과대 평가했다고 생각합니다. Winsock의 GetData 메서드를 사용하여 파일에 손을 뻗어 잡을 수는 없습니다. 클라이언트 응용 프로그램과 서버 측의 다른 응용 프로그램 사이에는 활성 연결이 있어야합니다. 연결이 설정되면이 서버 응용 프로그램이 응용 프로그램에 데이터를 제공하고 Winsock의 DataArrival 이벤트가 발생하며 GetData 메서드를 사용하여 검색 할 수 있습니다. 코드는 더 같이해야한다 : 이것은 그러나 완전한에서 멀리

Public Sub DownloadSock(ArqURL As String) 

    Dim arquivo() As Byte 
    Dim ficheiroID As Integer 

    ficheiroID = FreeFile 
    Me.Winsock1.Connect ArqURL, 80 

End Function 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 

    Dim ArqDestino As String 
    Dim arquivo() As Byte 
    Dim ficheiroID As Integer 

    ficheiroID = FreeFile 
    Open ArqDestino For Binary Access Write As #ficheiroID 
    Me.Winsock1.GetData arquivo() 
    Put #ficheiroID, , arquivo() 
    Close #ficheiroID 

End Sub 

(없으며 올바른 구문 보장, 그것은 의사 코드 고려). 연결을 한 후에는 파일 보내기를 시작하도록 서버에 알리는 메커니즘을 구현해야합니다. 파일이 충분히 크면 많은 DataArrival 이벤트를 모두 가져 와서 데이터를 가져 오는 동안 누적기에 보관해야합니다. 당신이 생각하는 것보다 더 많은 것이 있습니다.

자습서 및/또는 샘플 코드 (CodeProject에서 Winsock 컨트롤을 사용하는 VB6 프로젝트를 찾으십시오. 예 : this one).