Windowscode -> linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
Torakas
Beiträge: 63
Registriert: 13.09.2004 09:56

Windowscode -> linux

Beitrag 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
NetSlayer
Beiträge: 117
Registriert: 21.09.2004 21:18
Kontaktdaten:

Beitrag 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)
...MfG, NetSlayer
"No, I ain't got a problem. It's you with the problem!"
http://netslayer.scpn.net
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

DarkDragon hat das Protokoll bereits halbwegs gelöst,
vielleicht kriegste ja von ihm nen Code
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Torakas
Beiträge: 63
Registriert: 13.09.2004 09:56

Beitrag 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
Antworten