Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Internetseiten Aufrufen und verarbeiten...
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.06.2007, 07:31    Titel: Internetseiten Aufrufen und verarbeiten... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 28.06.2007, 07:47    Titel: Antworten mit Zitat

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 zwinkern
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
The real Agent D



Anmeldungsdatum: 24.11.2005
Beiträge: 605
Wohnort: Hall i. T.

BeitragVerfasst am: 28.06.2007, 09:33    Titel: Antworten mit Zitat

Da gibt es doch eh so ein Beispiel im Examples Ordner, wo der HTML Code einer Beliebigen Site angezeigt wird... zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.06.2007, 09:36    Titel: Antworten mit Zitat

jepp, danke...
da haenge ich gerade dran... klappt auch ganz gut bis jetzt...
jetzt muss ich den ganzen kram nur noch irgendwie richtig verarbeiten durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Build0815



Anmeldungsdatum: 30.09.2006
Beiträge: 51

BeitragVerfasst am: 28.06.2007, 17:31    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
jepp, danke...
...
jetzt muss ich den ganzen kram nur noch irgendwie richtig verarbeiten durchgeknallt


Tja am besten du liest dir das hier mal durch:
http://www.w3.org/TR/html4/ durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 29.06.2007, 07:22    Titel: Antworten mit Zitat

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 grinsen durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
alfonsospringer



Anmeldungsdatum: 27.04.2006
Beiträge: 445

BeitragVerfasst am: 29.06.2007, 13:48    Titel: Antworten mit Zitat

Du hättest auch eine Menge Spaß an der Umsetzung des HTTP Protokolls gehabt grinsen
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 29.06.2007, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 29.06.2007, 20:00    Titel: Antworten mit Zitat

recv ist ein Blocking Call, heißt, es wartet darauf, bis etwas empfangen wurde (bzw. 0 wenn die Verbindung getrennt wurde). lächeln
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 29.06.2007, 20:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 29.06.2007, 20:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 29.06.2007, 20:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 29.06.2007, 21:37    Titel: Antworten mit Zitat

japs
Einfach nach googlen, wurde mir vorhin auch empfohlen und die aktuellen Suchergebnisse sind "Brauchbar" happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 29.06.2007, 21:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.06.2007, 16:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.06.2007, 16:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 30.06.2007, 18:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.07.2007, 03:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.07.2007, 05:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.07.2007, 12:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz