Seite 1 von 1

Windowscode -> linux

Verfasst: 03.12.2004 22:47
von Torakas
Hi Leute,

ich verwende diesen Code gerade unter Windows um Webseite auszulesen, nur leider wuerde das nicht unter Linux laufen das ja Windows API Befehle verwendet werden.

kann mir vielleicht einer helfen wie man das umschreiben koennte damit es fuer alle System klappen wuerde.

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=7857&highlight=
; Author: ricardo (based on older Forum code)
; Date: 11. October 2003

Declare.s OpenURL(Url.s)

Procedure.s OpenURL(Url.s) 
  isLoop.b=1 
  INET_RELOAD.l=$80000000 
  hInet.l=0: hURL.l=0: Bytes.l=0 
  Buffer.s=Space(2048) 
  
  hInet = InternetOpen_("PB@INET", 1, #Null, #Null, 0) 
  hURL = InternetOpenUrl_(hInet, Url, #Null, 0, INET_RELOAD, 0) 
  
  Repeat 
    
    Delay(1) 
    InternetReadFile_(hURL, @Buffer, Len(Buffer), @Bytes) 
    If Bytes = 0 
      isLoop=0 
    Else 
      res.s = res + Left(Buffer, Bytes) 
    EndIf 
  Until isLoop=0 
  InternetCloseHandle_(hURL) 
  InternetCloseHandle_(hInet) 
  ProcedureReturn res 
EndProcedure 
danke schonmal im voraus.

Gruß,
Torakas

Verfasst: 03.12.2004 23:49
von NetSlayer
Solange du die WinAPI benützt wird das nicht klappen.

Allerdings ist HTTP auch nur ein Protokoll, das du mit Hilfe der Network-Library verwenden könntest.

Du kannst z.B. einfach eine Verbindung zu einem Webserver öffnen und ihm HTTP-Befehle senden, damit er dir die gewünschte Datei zusendet (in diesem Fall GET).

Sende dem Server mal folgendes:

Code: Alles auswählen

GET /deinOrdner/deineDatei.zip
Dann dürfte er dir das gewünschte File zusenden.

(lässt sich übrigens ganz gut mit Lars' Telnet Suite testen)

Verfasst: 04.12.2004 16:20
von bluejoke
DarkDragon hat das Protokoll bereits halbwegs gelöst,
vielleicht kriegste ja von ihm nen Code

Verfasst: 04.12.2004 16:32
von DarkDragon

Code: Alles auswählen

Procedure.s SendToHost(Host$, File$, _Data$)
  InitNetwork()
 
  ConnectionID = OpenNetworkConnection(Host$, 80)
 
  If ConnectionID
 
    String$ = ""
    If _Data$ <> ""
      String$ + "POST " + File$ + " HTTP/1.1" + Chr(13) + Chr(10)

      String$ + "Content-Length: " + Str(Len(_Data$)) + Chr(13) + Chr(10)
    Else
      String$ + "GET " + File$ + " HTTP/1.1" + Chr(13) + Chr(10)
    EndIf
 
    String$ + "Host: " + Host$ + Chr(13) + Chr(10)
    String$ + "Content-Type: application/x-www-form-urlencoded" + Chr(13) + Chr(10)
    String$ + "Connection: close" + Chr(13) + Chr(10)
    String$ + Chr(13) + Chr(10)
    String$ + _Data$ + Chr(13) + Chr(10)
 
    SendNetworkString(ConnectionID, String$)
    While NetworkClientEvent(ConnectionID) <> 2
      Delay(1)
    Wend
    size = 100000
    *Buffer = AllocateMemory(size)
    
    laenge = 1
    While laenge <> 0
      laenge.l = ReceiveNetworkData(ConnectionID, *Buffer, size)
      If laenge <> 0 And Len(string.s)+laenge < 63999
        string.s = string.s + PeekS(*Buffer, laenge)
      EndIf
    Wend
 
    Text.s = string.s
    FreeMemory(*Buffer)
    Start = FindString(Text, Chr(13)+Chr(10)+Chr(13)+Chr(10), 0)+9
    CloseNetworkConnection(ConnectionID)
    ProcedureReturn Mid(Text, Start+1, (Len(Text)-Start)-1)
  EndIf
 
EndProcedure
 
 
Debug SendToHost("www.bradan.net", "/index.php", "visited=1")
Dank geht an robink

Verfasst: 04.12.2004 18:57
von Torakas
Danke für die schnelle antwort und für eine die so super idee wie man das machen kann. Grosses Danke nochmal an alle.

Hab aber noch eine Sache wie ich dran verbessern wuerde... Im File musste ich Parameter mit übergeben "?time=xxxx&query=SELECT * FROM xxxx" und so weiter. Da hab ich bemerkt das er das nicht annimmt wenn normale Spaces setzt.

Daher sollte man in der Procedure nach dem ConnectionID nach diese Zeile einbauen:

Code: Alles auswählen

File$ = ReplaceString(File$, " ", "%20")
Ansonsten.. Respekt und nochmals danke..

Hab aber noch einen Fehler gefunden... Im Programm heisst es:

Code: Alles auswählen

Start = FindString(Text, Chr(13)+Chr(10)+Chr(13)+Chr(10), 0)+9 
es sind aber nur 8 Zeichen die er weiterzaehlen muss (jedenfalls bei mir). Also muss es heissen:

Code: Alles auswählen

Start = FindString(Text, Chr(13)+Chr(10)+Chr(13)+Chr(10), 0)+8
Gruß,
Torakas