hiho ich hab ma fix nen kleenes beispiel gemacht is natürlich ohne irgendwelche fehlerbehandlung aber so ca kann man es machen :
Option Strict On
Public Class HttpDownloadEX
Public Event DownloadFinished()
Public Event DownloadProgress(ByVal progress As String)
Public Event DownloadError(reason as string)
Private firstpacket As Boolean = True
Private kb As Integer = 1024
Private StartTick As Long = 0
Private DownloadedBytes As Long = 0
Private Abort As Boolean
Private Structure STATEOBJECT
Dim sock As Net.Sockets.Socket
Const bufSize% = 32768
Dim buf() As Byte
Dim fStream As IO.FileStream
Dim resuming As Boolean
Dim fSize&
Dim remoteFileName$
Dim port%
Dim rHOST$
Dim connected As Boolean
Dim fName$
End Structure
Public Sub New(ByVal host As String, ByVal remoteFileName As String, ByVal _
localFile As String, Optional ByVal port As Integer = 80)
startdownload(host, remoteFileName, localFile, port)
End Sub
Private Sub startdownload(ByVal host As String, ByVal remoteFileName As _
String, ByVal localFile As String, Optional ByVal port As Integer = 80)
Dim fSize&
Dim sObject As New STATEOBJECT
sObject.fName = localFile
If IO.File.Exists(localFile) Then sObject.resuming = True
If IO.File.Exists(localFile) Then fSize = New IO.FileInfo( _
localFile).Length
ReDim sObject.buf(sObject.bufSize - 1)
sObject.fSize = fSize
sObject.fStream = Nothing
sObject.port = port
sObject.remoteFileName = remoteFileName
sObject.rHOST = host
sObject.sock = New Net.Sockets.Socket( _
Net.Sockets.AddressFamily.InterNetwork, _
Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
Net.Dns.BeginResolve(host, AddressOf resolvecallback, sObject)
End Sub
Protected Sub resolvecallback(ByVal ar As IAsyncResult)
Dim sobject As STATEOBJECT = CType(ar.AsyncState, STATEOBJECT)
If Not ar.IsCompleted Then
Net.Dns.BeginResolve(sobject.rHOST, AddressOf resolvecallback, _
sobject)
Exit Sub
End If
Dim rhe As Net.IPHostEntry = Net.Dns.EndResolve(ar)
Dim ipe As New Net.IPEndPoint(rhe.AddressList(0), sobject.port)
sobject.sock.BeginConnect(ipe, AddressOf connectcallback, sobject)
End Sub
Protected Sub connectcallback(ByVal ar As IAsyncResult)
Dim sobject As STATEOBJECT = CType(ar.AsyncState, STATEOBJECT)
Try
sobject.sock.EndConnect(ar)
sobject.connected = True
' hier sind wir nun connected und sollten erstmal unseren request
' senden und natürlich die response empfangen !
sobject.buf = System.Text.Encoding.Default.GetBytes(HttpRequest( _
sobject))
Dim bSent As Integer = sobject.sock.Send(sobject.buf, 0, _
sobject.buf.Length, Net.Sockets.SocketFlags.None)
ReDim sobject.buf(sobject.bufSize - 1)
sobject.sock.BeginReceive(sobject.buf, 0, sobject.bufSize, _
Net.Sockets.SocketFlags.None, AddressOf readcallback, sobject)
Catch e As System.Net.Sockets.SocketException
If e.ErrorCode = 10065 Then
' connection timed out ...
RaiseEvent DownloadError("Connection timed out ...")
Abort = True
ElseIf e.ErrorCode = 10061 Then
' connection refused ...
RaiseEvent DownloadError("connection refused ...")
Abort = True
Else
RaiseEvent DownloadError("Connection error ...")
Abort = True
End If
End Try
End Sub
' empfängt daten vom webserver !
Protected Sub readcallback(ByVal ar As IAsyncResult)
If Not Abort Then
Dim sobject As STATEOBJECT = CType(ar.AsyncState, STATEOBJECT)
Dim bRead% = sobject.sock.EndReceive(ar)
If bRead = 0 Then
' download finished
RaiseEvent DownloadFinished()
If Not Nothing Is sobject.sock Then
sobject.sock.Close()
End If
sobject = Nothing
Exit Sub
End If
processData(sobject, bRead)
ReDim sobject.buf(sobject.bufSize - 1)
sobject.sock.BeginReceive(sobject.buf, 0, sobject.bufSize, _
Net.Sockets.SocketFlags.None, AddressOf readcallback, sobject)
End If
End Sub
fortsetzung folgtahoi |