Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Internet und Netzwerke

Websites selbst verarbeiten

Lizenz:Erster Autor:Letzte Bearbeitung:
GPLMitgliedPMedia 22.01.2008

Nun gut, wir haben inzw. hier ein Beispiel, welches den Browser mit einer gegebenen URL aufruft. Was machen wir aber, wenn wir das nicht wollen, zB weil das Programm den einen Server auf Updates prüfen soll und diese bei Bedarf selbst herunterladen soll? RFC's lesen und die tollen Netzwerkbibliotheken nutzen? Nun, das ist jetzt nicht mehr nötig, denn dafür gibts diesen tollen Code:

#ifdef __FB_WIN32__
#include once "win/winsock2.bi"
#else
#include once "crt/netdb.bi"
#include once "crt/sys/socket.bi"
#include once "crt/netinet/in.bi"
#include once "crt/arpa/inet.bi"
#include once "crt/unistd.bi"
#endif

#ifndef recvbufflen
#define RECVBUFFLEN 16384
#endif
#ifndef newline
#define newline chr(13,10)
#endif

Sub InitWinsock Constructor
    #ifdef __FB_WIN32__
    '' init winsock
    Dim wsaData As WSAData
    If( WSAStartup( MAKEWORD( 1, 1 ), @wsaData ) <> 0 ) Then
        Print "Error: WSAStartup failed"
        End 1
    End If
    #Endif
End Sub

Sub ExitWinsock Destructor
    #ifdef __FB_WIN32__
    WSACleanup
    #Endif
End Sub

Function httpget(server As String, path As String, hadd as string = "") As String
    Dim IP As Integer
    Dim ia As in_addr
    Dim s As SOCKET
    Dim hostentry As hostent Ptr
    Dim sendbuffer As String
    Dim recvbuffer As Zstring * RECVBUFFLEN+1
    Dim bytes As Integer
    Dim sa As sockaddr_in
    Dim in as string
    ia.S_addr = inet_addr( server )
    If ( ia.S_addr = INADDR_NONE ) Then
        hostentry = gethostbyname( server )
        If ( hostentry = 0 ) Then
            return "IP couldn't be resolved!"
        End If
        IP = *cast( Integer Ptr, *hostentry->h_addr_list )
    Else
        IP = ia.S_addr
    End If
    s = opensocket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
    If( s = 0 ) Then
        return "Socket couldn't be opened."
    End If
    sa.sin_port         = htons( 80 )
    sa.sin_family       = AF_INET
    sa.sin_addr.S_addr  = ip
    If ( connect( s, cast( PSOCKADDR, @sa ), Len( sa )) = SOCKET_ERROR ) Then
        closesocket( s )
        return "Couldn't connect to host"
    End If
    sendBuffer = "GET /" + path + " HTTP/1.0" + NEWLINE + _
    "Host: " + server + NEWLINE + _
    "Connection: close" + NEWLINE + _
    hadd + _
    NEWLINE
    If( send( s, sendBuffer, Len( sendBuffer ), 0 ) = SOCKET_ERROR ) Then
        closesocket( s )
        return "Couldn't send request"
    End If
    Do
        bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
        If( bytes <= 0 ) Then
            exit do
        End If
        recvbuffer[bytes] = 0
        in += recvbuffer
    Loop
    shutdown( s, 2 )
    closesocket( s )
    return in
End Function


Function httppost(server As String, path As String, toPost As String, hadd as string = "") As String
    Dim IP As Integer
    Dim ia As in_addr
    Dim s As SOCKET
    Dim hostentry As hostent Ptr
    Dim sendbuffer As String
    Dim recvbuffer As Zstring * RECVBUFFLEN+1
    Dim bytes As Integer
    Dim sa As sockaddr_in
    Dim in as string

    ia.S_addr = inet_addr( server )
    If ( ia.S_addr = INADDR_NONE ) Then
        hostentry = gethostbyname( server )
        If ( hostentry = 0 ) Then
            return "IP couldn't be resolved!"
        End If
        IP = *cast( Integer Ptr, *hostentry->h_addr_list )
    Else
        IP = ia.S_addr
    End If
    s = opensocket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
    If( s = 0 ) Then
        return "Socket couldn't be opened."
    End If
    sa.sin_port         = htons( 80 )
    sa.sin_family       = AF_INET
    sa.sin_addr.S_addr  = ip
    If ( connect( s, cast( PSOCKADDR, @sa ), Len( sa )) = SOCKET_ERROR ) Then
        closesocket( s )
        return "Couldn't connect to host"
    End If
    sendBuffer = "POST /" + path + " HTTP/1.0" + NEWLINE + _
    "Host: " + server + NEWLINE + _
    "Content-Type: application/x-www-form-urlencoded" + NEWLINE + _
    "Content-Length: " + str(len(toPost)) + NEWLINE + _
    "Connection: close" + NEWLINE + _
    hadd + _
    NEWLINE + _
    toPost + NEWLINE
    If( send( s, sendBuffer, Len( sendBuffer ), 0 ) = SOCKET_ERROR ) Then
        closesocket( s )
        return "Couldn't send request"
    End If
    Do
        bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
        If( bytes <= 0 ) Then
            exit do
        End If
        recvbuffer[bytes] = 0
        in += recvbuffer
    Loop
    shutdown( s, 2 )
    closesocket( s )
    return in
End Function

Auch wenn ich zugeben muss, nur das /examples/libraries/networking/http_get.bas-Beispiel angepasst zu haben und in eine Sub-Form gepackt hab ^^
Aufruf ist denkbar einfach, mit

print httpGet("www.freebasic.net","index.html")

holen wir die Startseite der engl. Freebasic-Website und zeigen sie an.

Wollen wir Daten übermitteln, zB für Onlinehiscores, so verwenden wir httpPost, welches genauso arbeitet wie httpGet, allerdings dem ganzen einen weiteren Parameter hinzufügt, der die Daten, die übermittelt werden sollen, beinhaltet. (Und ja, ich weiß, auch mit httpGet kann man Daten übertragen, allerdings nur bis 1024 Zeichen, Post ist da wesentlich tauglicher, da es mehr Daten übertragen kann und nicht so anfällig für Manipulationen ist)

Der letzte, optionale Parameter gibt an, dass noch weitere Headerangaben übermittelt werden, welche mit diesem auch angegeben werden. Es ist übrigens essentiell, dass diese korrekt mit CRLF enden, drum empfehle ich diesen Parameter nur denen, die sich mit dem HTTP-Protokoll auseinandergesetzt haben.


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 08.01.2008 von MitgliedPMedia angelegt.
  • Die aktuellste Version wurde am 22.01.2008 von MitgliedPMedia gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen