Code-Beispiel
Websites selbst verarbeiten
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
GPL | PMedia | 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 PMedia angelegt.
- Die aktuellste Version wurde am 22.01.2008 von PMedia gespeichert.
|
|