Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.06.2007, 07:31 Titel: Internetseiten Aufrufen und verarbeiten... |
|
|
Hi,
es sollte mit FreeBASIC ja eigentlich moeglich sein eine art Browser zu schreiben, leider hab ich auf dem Gebiet der Netzwerkprogrammierung mehr oder weniger null ahnung...
Meine Frage,
wie kann ich ueber FreeBASIC eine Internetseite aufrufen um dann die ankommenden Daten der Seite weiter zu verarbeiten.. zB LogIn auf eine Seite ect... _________________
 |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 28.06.2007, 07:47 Titel: |
|
|
winsock auf den server verbinden, dazu siehe am einfachsten das winsock-tutorial auf c-worker.ch, dann den entsprechenden http-request senden, siehe dazu die http-spezifikation, fang am besten bei wiki an. einfach HTTP eingeben.. ist halt n bisschen arbeit  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
The real Agent D

Anmeldungsdatum: 24.11.2005 Beiträge: 605 Wohnort: Hall i. T.
|
Verfasst am: 28.06.2007, 09:33 Titel: |
|
|
Da gibt es doch eh so ein Beispiel im Examples Ordner, wo der HTML Code einer Beliebigen Site angezeigt wird...  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.06.2007, 09:36 Titel: |
|
|
jepp, danke...
da haenge ich gerade dran... klappt auch ganz gut bis jetzt...
jetzt muss ich den ganzen kram nur noch irgendwie richtig verarbeiten  _________________
 |
|
Nach oben |
|
 |
Build0815

Anmeldungsdatum: 30.09.2006 Beiträge: 51
|
Verfasst am: 28.06.2007, 17:31 Titel: |
|
|
Eternal_pain hat Folgendes geschrieben: | jepp, danke...
...
jetzt muss ich den ganzen kram nur noch irgendwie richtig verarbeiten  |
Tja am besten du liest dir das hier mal durch:
http://www.w3.org/TR/html4/  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.06.2007, 07:22 Titel: |
|
|
Danke, gute Seite.. aber werd ich soweit nicht brauchen, da ich nicht vorhabe einen kompletten Browser zu schreiben.
Das ganze soll nur ein kleiner Chat-Bot fuer ein in JS geschriebenen Chat sein, also will ich eigentlich nur den Chat ansich auslesen, wer, was, wann und wo geschrieben hat, worauf der Bot spaeter mal reagieren soll  _________________
 |
|
Nach oben |
|
 |
alfonsospringer
Anmeldungsdatum: 27.04.2006 Beiträge: 445
|
Verfasst am: 29.06.2007, 13:48 Titel: |
|
|
Du hättest auch eine Menge Spaß an der Umsetzung des HTTP Protokolls gehabt  _________________ Die Antworten zu fast allen Fragen des Lebens findest du entweder im MonsterFAQ oder der Befehlsreferenz - Und wenn du gar nicht mehr weiter weisst ? -> Wikipedia
ALLE RECHTSCHREIBFEHLER DIE ICH MACHE SIND BEABSICHTIGT, DAMIT DIE LEUTE, DIE SPAß DARAN HABEN SOLCHE ZU FINDEN, ETWAS ZU TUN HABEN |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.06.2007, 18:23 Titel: |
|
|
Tach,
obwohl eigentlich alles bisher ganz gut geklappt hat, muss ich mich nun etwas wundern
da das eigentliche Beispiel von httpget.bas mit winsock ploetzlich nicht mehr laeuft.
Code: |
#include once "win/winsock.bi"
const RECVBUFFLEN = 8192
const NEWLINE = "\r\n"
const DEFAULT_HOST = "www.wikipedia.org"
declare sub gethostandpath ( src as string, hostname as string, path as string )
declare function resolveHost ( hostname as string ) as integer
'' globals
dim hostname as string
dim path as string
'' check command-line
gethostandpath command$, hostname, path
if( len( hostname ) = 0 ) then
hostname = DEFAULT_HOST
end if
'' init winsock
dim wsaData as WSAData
if( WSAStartup( MAKEWORD( 1, 1 ), @wsaData ) <> 0 ) then
print "Error: WSAStartup failed"
end 1
end if
'' resolve name
dim ip as integer
dim s as SOCKET
ip = resolveHost( hostname )
if( ip = 0 ) then
print "Error: resolveHost failed"
end 1
end if
'' open socket
s = opensocket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
if( s = 0 ) then
print "Error:"; WSAGetLastError; " Calling: socket()"
end 1
end if
'' connect to host
dim sa as sockaddr_in
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
print "Error:"; WSAGetLastError; " Calling: connect()"
closesocket( s )
end 1
end if
'' send HTTP request
dim sendbuffer as string
sendBuffer = "GET /" + path + " HTTP/1.0" + NEWLINE + _
"Host: " + hostname + NEWLINE + _
"Connection: close" + NEWLINE + _
"User-Agent: GetHTTP 0.0" + NEWLINE + _
NEWLINE
if( send( s, sendBuffer, len( sendBuffer ), 0 ) = SOCKET_ERROR ) then
print "Error:"; WSAGetLastError; " Calling: send()"
closesocket( s )
end 1
end if
'' receive until connection is closed
dim recvbuffer as zstring * RECVBUFFLEN+1
dim bytes as integer
do
bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
if( bytes <= 0 ) then
exit do
end if
'' add the null-terminator
recvbuffer[bytes] = 0
'' print buffer as a string
print recvbuffer
loop
sleep
'' close socket
shutdown( s, 2 )
closesocket( s )
'' quit winsock
WSACleanup
'':::::
sub gethostandpath( src as string, hostname as string, path as string )
dim p as integer
p = instr( src, " " )
if( p = 0 or p = len( src ) ) then
hostname = trim( src )
path = ""
else
hostname = trim( left( src, p-1 ) )
path = trim( mid( src, p+1 ) )
end if
end sub
'':::::
function resolveHost( hostname as string ) as integer
dim ia as in_addr
dim hostentry as hostent ptr
'' check if it's an ip address
ia.S_addr = inet_addr( hostname )
if ( ia.S_addr = INADDR_NONE ) then
'' if not, assume it's a name, resolve it
hostentry = gethostbyname( hostname )
if ( hostentry = 0 ) then
exit function
end if
function = *cast( integer ptr, *hostentry->h_addr_list )
else
'' just return the address
function = ia.S_addr
end if
end function
|
bei der Zeile
bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
haengt das Programm sich einfach auf,
waerend ein anderes Programm das diese Zeilen genauso beinnhaltet aber ohne Probleme
funktioniert..
Woran liegt das? Versuche das schon seit heute mittag... _________________
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 29.06.2007, 20:00 Titel: |
|
|
recv ist ein Blocking Call, heißt, es wartet darauf, bis etwas empfangen wurde (bzw. 0 wenn die Verbindung getrennt wurde).  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.06.2007, 20:15 Titel: |
|
|
Aber wie kann es sein, das genau der selbe Teil, gesplittet in zwei Funktionen
ohne probleme laeuft? Der Inhalt der Functionen ist absolut identisch mit dem was da oben steht... _________________
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 29.06.2007, 20:36 Titel: |
|
|
Mao hat Recht.
Du musst entweder Select() verwenden, um zu prüfen ob Daten vorliegen (=Socket lesbar) oder du machst nen thread, der das Empfangen der Daten regelt. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.06.2007, 20:45 Titel: |
|
|
Select?
Code: |
declare function select_ alias "select" (byval nfds as integer, _
byval as fd_set ptr, _
byval as fd_set ptr, _
byval as fd_set ptr, _
byval as timeval ptr) as integer |
Die ? _________________
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 29.06.2007, 21:37 Titel: |
|
|
japs
Einfach nach googlen, wurde mir vorhin auch empfohlen und die aktuellen Suchergebnisse sind "Brauchbar"  |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 29.06.2007, 21:53 Titel: |
|
|
http://fbnp.mlaumen.dyndns.org/index.php?view=191
So ungefähr sollte es aussehen.
Weiß nicht genau, ob man den Code genau übernehmen kann. Musst du selber mal versuchen. Du musst dir dann eine Do: Loop Schleife basteln, die so lange empfängt wie es nötig ist. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.06.2007, 16:12 Titel: |
|
|
Ich hab es jetzt mal so versucht, aber leider empfang ich nun gar nichts mehr...
Code: |
Dim recvbuffer As Zstring * RECVBUFFLEN+1
Dim bytes As Integer
Dim fdset As FD_SET
Dim tv As timeval
Do
fd_set_ (s, @fdset)
bytes = select_(s+1, @fdset, 0, 0, @tv)
If (bytes = -1) Then
Print "Fehler"
Else
If (FD_ISSET(s, @fdSet))<>0 Then
bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
If bytes > 0 Then
recvbuffer[bytes] = 0
Print recvbuffer
End If
End If
End If
Sleep (5),1
Loop Until Multikey(&h01)
|
_________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.06.2007, 16:37 Titel: |
|
|
konnte es erst einmal mit ein paar offenen Fragen loesen...
Code: |
dim recvbuffer as zstring * RECVBUFFLEN+1
dim bytes as integer
Dim fdset As FD_SET
Dim tv As timeval
Dim recvTimer as double=Timer
do
fd_set_ (s, @fdset)
bytes = select_(s+1, @fdset, 0, 0, @tv)
If (bytes = -1) Then
Print "Fehler"
Else
If (FD_ISSET(s, @fdSet))<>0 Then
bytes = recv( s, recvBuffer, RECVBUFFLEN, 0 )
if( bytes > 0 ) then
recvbuffer[bytes] = 0
?recvbuffer
recvTimer=Timer
end if
end if
end if
loop until Timer-recvtimer>30
|
Den hauptteil des oberen Codes hab ich aus einer noch funktionierenden angefangen Routine, und obwohl er nur gering von dem Code davor abweicht funktioniert dieser ohne fehler.... _________________
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 30.06.2007, 18:40 Titel: |
|
|
Von mir früher einmal programmierte Variante eines einfachen Surf-Bots:
http://beilagen.dreael.ch/QB/AUTOKLCK.VBS
=> Steuert den Internet Exploror via ActiveX-Automatisierungsobjekt an unter Verwendung von VBScript und Windows Script Host. Auf die Inhalte greift man übrigens über das Document Object Model zu.
Ansonsten kann man wie bereits diskutiert, das (im Grunde genommen sehr einfach aufgebaute) HTTP-Protokoll auch selber implementieren wie in den bereits geposteten Codebeispielen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.07.2007, 03:03 Titel: |
|
|
Inzwischen hab ich rausgefunden warum meine Anfragen mal gehen und mal nicht... kleiner unaufaelliger fehler bei der GET abfrage...
Code: |
Const NEWLINE = !"\r\n"
SendBuffer= _
"GET / "+path+" HTTP/1.1"+NEWLINE+ _
"Host: "+hostname+NEWLINE+ _
"Connection: close"+NEWLINE+ _
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"+NEWLINE+ _
"Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"+NEWLINE+ _
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"+NEWLINE+ _
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 Web-Sniffer/1.0.24"+NEWLINE+ _
"Referer: http://www.willst-du-mein-freund-sein.com/"+NEWLINE+ _
NEWLINE
|
dabei ist zu beachten das am ende 2 (in Worten zwei) mal NEWLINE gesendet wird... ansonsten passiert nichts... _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.07.2007, 05:03 Titel: |
|
|
Ich habe jetzt mal versucht einen einen HTTP POST zu machen, aber irgendwie kommt nichts an, muss man da noch etwas hinzufuegen?
Habe bisher nur den SendBuffer String mit den POST Informationen geaendert
Edit:
Hab den Fehler gefunden, das Problem war, das
Code: | Const NEWLINE = !"\r\n" |
NICHT das selbe ist wie
Code: | Dim test as String
test="\r\n"
|
was bedeutet das ! vor dem String? _________________
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.07.2007, 12:30 Titel: |
|
|
soviel ich weiß, heißt das !, dass in den escape-modus umgeschaltet wird, also \r zu chr(13) umgewandelt wird. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|