>> Z.B. wenn 5 Sekunden keine Antwort vom Server kam, dann FALSE zurückgeben.
Oder hat jemand sonstige Vorschläge?
Du könntest ein Ping mit einer timeout Angabe ausführen. Hier ein Beispiel:
Imports System
Imports System.Web
Imports System.Net
Imports System.Collections
Imports System.Net.Sockets
Imports System.Runtime.Remoting.Channels.Http
Public Class Main
Public Shared Sub Main()
Dim res As Boolean
Dim host As String = "vbarchiv.net"
Dim url as String = "http://" + host + "/home/willkommen.php"
Dim pingRes As Boolean = Ping.Ping(host, 1000) Or Ping.Ping(host, 1000) '//
If pingRes Then
res = WebFileExists(url)
End If
Console.WriteLine ("URL: " + url)
Console.WriteLine ("Ping Result: " + pingRes.ToString())
Console.WriteLine ("FileExists Result: " + res.ToString())
End Sub
Public Shared Function WebFileExists(ByVal URL As String) As Boolean
Try
Dim sBuffer As String
Dim oRequest As WebRequest = WebRequest.Create(URL)
oRequest.Method = "GET"
Dim oResponse As WebResponse = oRequest.GetResponse()
Dim oStream As New System.IO.StreamReader( _
oResponse.GetResponseStream())
sBuffer = oStream.ReadLine()
oStream.Close()
oResponse.Close()
Return (sBuffer.Length = 0)
Catch e As Net.WebException
Return False
End Try
End Function
Public Class ping
Public Class RequestState
Public host As IPHostEntry
Public Sub New()
host = Nothing
End Sub
End Class
Private Shared Sub RespCallback(ar As IAsyncResult)
Try
Dim tempRequestState As RequestState = CType(ar.AsyncState, _
RequestState)
tempRequestState.host = Dns.EndResolve(ar)
Catch e As ArgumentNullException
Console.WriteLine (e.Message)
Catch e As Exception
Console.WriteLine (e.Message)
End Try
End Sub
Public Shared Function Ping(ByVal host As String, ByVal timeout As Integer) _
As Boolean
Dim myRequestState As RequestState
Dim asyncResult As IAsyncResult
myRequestState = New RequestState()
asyncResult = CType(Dns.BeginResolve(host, AddressOf RespCallback, _
myRequestState),IAsyncResult)
While asyncResult.IsCompleted <> True
End While
If myRequestState.host Is Nothing Then Return 0
Dim ip As IPAddress = myRequestState.host.AddressList(0)
Dim ipEndPoint As IPEndPoint = New IPEndPoint (ip, 7)
Dim socket As Socket = New Socket (AddressFamily.InterNetwork, _
SocketType.Raw, ProtocolType.Icmp)
Dim icmpPacket As Byte() = {8, 0, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
0, 0}
Dim result As Integer = socket.SendTo(icmpPacket, icmpPacket.Length, _
SocketFlags.None, ipEndPoint)
Dim receivedData As ArrayList = New ArrayList
receivedData.Add(socket)
Socket.Select(receivedData, Nothing, Nothing, timeout * 1000)
Dim receiveICMPPacket() As Byte = New Byte(200){}
Dim bytes As Integer = 0
If receivedData.Count > 0 Then
bytes = socket.Receive(receiveICMPPacket, receiveICMPPacket.Length, _
SocketFlags.None)
Return getICMPChecksum(receiveICMPPacket) = 0
Else
Return False
End If
End Function
Private Shared Function getICMPChecksum(ByVal icmpP() As Byte) As System.Int32
Try
Dim buffer As Byte()
If (icmpP.Length Mod 2) > 0 Then
buffer = New Byte(icmpP.Length + 1){}
icmpP.CopyTo(buffer, 0)
buffer(buffer.Length - 1) = 0
Else
buffer = New Byte(icmpP.Length){}
icmpP.CopyTo(buffer, 0)
End If
Dim checksum As Integer = 0
For i As Integer = 0 To buffer.Length - 2 Step 2
Dim firstByte As Byte = buffer(i + 1)
Dim secondByte As Byte = buffer(i)
Dim word As System.Int32 = Cint(secondByte)
word = CType(((word << 8) + firstByte), System.Int32)
checksum += word
Next
checksum = (checksum >> 16) + (checksum And 65535)
checksum += (checksum >> 16)
Return CType((Not checksum And 65535), System.Int32)
Catch Ex As Exception
Console.WriteLine(ex.ToString())
Return 0
End Try
End Function
End Class
End Class(Sollte funzen)
Der Ping (eigentlich C#) Code ist aus dem "DotNet" Magazin, falls es dich interessiert.
Steve |