Datei über Proxy Verbindung Herunterladen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Datei über Proxy Verbindung Herunterladen

Beitrag von X360 Andy »

Es ist ja bekannt das die PB HTTP LIB keine Proxy Verbindungen unterstützt, aber wie kann ich (ohne API am besten) eine Datei runterladen aus dem WWW mit aktiven Proxy ?

Beim Suchen bin ich auf den Auto Updater von HeX0R gekommen
> http://purebasic.fr/german/viewtopic.php?t=18904

Source hab ich mir mal angeschaut, den HTTP Download Teil sticht finde ich nicht wirklich raus, da ich nich weiß welche Teile ich alles brauche.

Gibt es irgendwo ein einfaches Beispiel wie ich eben eine Datei über eine Proxy Verbindung runterladen kann.

Würde mich über ein Beispiel/Link etc. freuen.


Die Info ob eine Proxy aktiv ist steht doch in der Registry oder ?
Wenn ja dann bräuchte das Programm ab Vista ja admin rechte oder ?
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Hier mal ein Code mit dem man sich über einen HTTP/Socks4/Socks5 Proxy, IPVv4 & IPv6 verbinden kann. Leider weiß ich nicht mehr wo ich den Code gefunden hab, Credits an den Autor:

Die Connection-ID kann man dann mit den normalen PB - Netzwerkbefehlen verwenden.

Code: Alles auswählen

InitNetwork()

Procedure.l IsIP(ip.s)
  ;ReturnValues :
  ;0 = no ip
  ;1 = IPv4 - IP
  ;2 = IPv6 - IP
  count.l = CountString(ip, ".")
  If count = 3
    ret.l = 1
  ElseIf count = 5
    ret.l = 2
  Else
    ProcedureReturn 0
  EndIf
  For i = 0 To count
    a$ = StringField(ip, i + 1, ".")
    If a$ = "" Or Str(Val(a$))<>a$ Or Val(a$)>255 Or Val(a$)<0
      ProcedureReturn 0
    EndIf
  Next i
  ProcedureReturn ret
EndProcedure

Procedure.l Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, type.l, username.s, userpass.s, timeout.l)
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
  
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
  
  netid.l = OpenNetworkConnection(proxy_ip, proxy_port)
  
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
  
  Select type
      
    Case 0
      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
      
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
      
      If username And userpass
        user$ = username + ":" + userpass
        length.l = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
      
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          Content$ = Space(14500)
          length.l = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      Result.l = 0
      For i = 1 To CountString(Content$, Chr(10))
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 1
      ;====================
      ;Socks4 - Proxy
      ;====================
      
      ;Socks4 only supports IPv4 !
      ;You have to do a DNS-Lookup before using this on urls, otherwise it will fail!
      If IsIP(ip_to_connect)<>1
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;Phase 1 SOCK4
      ;Send Request
      PokeB(*buffer, 4)
      PokeB(*buffer + 1, 1)
      hi.l = Int(port_to_connect/256)
      lo.l = port_to_connect-(256*hi)
      PokeB(*buffer + 2, hi)
      PokeB(*buffer + 3, lo)
      For i = 1 To 4
        PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
      Next i
      PokeS(*buffer + 8, username)
      length.l = 9 + Len(username)
      SendNetworkData(netid, *buffer, length)
      ;Check if connection is established
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 1024)
          ver.l = PeekB(*buffer) & 255
          CD.l = PeekB(*buffer + 1) & 255
          port.l = (PeekB(*buffer + 2) & 255)*256
          port + (PeekB(*buffer + 3) & 255)
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>0 Or CD<>90
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;IP and Port should be the same like ip_to_connect/port_to_connect and is just for information
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 2
      ;====================
      ;Socks5 - Proxy
      ;====================
      
      ;Phase 1 SOCK5
      ;Send wished method
      If username = "" And userpass = ""
        length.l = 3
        PokeB(*buffer, 5)
        PokeB(*buffer + 1, 1)
        PokeB(*buffer + 2, 0)
      Else
        length.l = 4
        PokeB(*buffer, 5)
        PokeB(*buffer + 1, 2)
        PokeB(*buffer + 2, 0)
        PokeB(*buffer + 3, 2)
      EndIf
      SendNetworkData(netid, *buffer, length)
      ;Check if method is allowed
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 2)
          ver.l = PeekB(*buffer) & 255
          method.l = PeekB(*buffer + 1) & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or method = 255
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      If method = 2
        ;Phase 2 SOCK5
        ;Send Username/Password (if allowed)
        PokeB(*buffer, 1)
        PokeB(*buffer + 1, Len(username))
        PokeS(*buffer + 2, username)
        k = 2 + Len(username)
        PokeB(*buffer + k, Len(userpass))
        PokeS(*buffer + k + 1, userpass)
        SendNetworkData(netid, *buffer, Len(userpass) + 1 + k)
        ;Check if Username/Password is accepted
        check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
        Repeat
          Delay(10)
          If NetworkClientEvent(netid) = 2
            ReceiveNetworkData(netid, *buffer, 2)
            passver.l = PeekB(*buffer) & 255
            status.l = PeekB(*buffer + 1) & 255
            Break
          EndIf
        Until check_timeout<ElapsedMilliseconds()
        If check_timeout<ElapsedMilliseconds() Or passver<>1 Or status<>0
          FreeMemory(*buffer)
          CloseNetworkConnection(netid)
          ProcedureReturn #False
        EndIf
      EndIf
      ;Phase 3 SOCK5
      ;Send Connect-Request
      PokeB(*buffer, 5)
      PokeB(*buffer + 1, 1)
      PokeB(*buffer + 2, 0)
      Select IsIP(ip_to_connect)
        Case 0
          PokeB(*buffer + 3, 3)
          PokeB(*buffer + 4, Len(ip_to_connect))
          For i = 1 To Len(ip_to_connect)
            PokeB(*buffer + 4 + i, Asc(Mid(ip_to_connect, i, 1)))
          Next i
          cont.l = 4 + i
        Case 1
          PokeB(*buffer + 3, 1)
          For i = 1 To 4
            PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
          Next i
          cont.l = 8
        Case 2
          PokeB(*buffer + 3, 4)
          For i = 1 To 6
            PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
          Next i
          cont.l = 10
      EndSelect
      hi.l = Int(port_to_connect/256)
      lo.l = port_to_connect-(256*hi)
      PokeB(*buffer + cont, hi)
      PokeB(*buffer + cont + 1, lo)
      SendNetworkData(netid, *buffer, cont + 2)
      ;Now Check the reply
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          length.l = ReceiveNetworkData(netid, *buffer, 1024)
          ver.l = PeekB(*buffer) & 255
          reply.l = PeekB(*buffer + 1) & 255
          reserved.l = PeekB(*buffer + 2) & 255
          atyp.l = PeekB(*buffer + 3) & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or reply<>0 Or reserved<>0
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      Select atyp
        Case 1
          ;IPv4
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
          port.l = (PeekB(*buffer + 8) & 255)*256
          port + (PeekB(*buffer + 9) & 255)
        Case 3
          ;Name
          ip.s = ""
          For i = 1 To (PeekB(*buffer + 4) & 255)
            ip + Chr(PeekB(*buffer + 4 + i) & 255)
          Next i
          port.l = (PeekB(*buffer + 4 + i) & 255)*256
          port + (PeekB(*buffer + 5 + i) & 255)
        Case 4
          ;IPv6
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255) + "."
          ip + Str(PeekB(*buffer + 8) & 255) + "." + Str(PeekB(*buffer + 9) & 255)
          port.l = (PeekB(*buffer + 10) & 255)*256
          port + (PeekB(*buffer + 11) & 255)
      EndSelect
      ;Following IP and Port is just for information...
      ;this is proxy-internal and not necessarily the same as ip_to_connect/port_to_connect
      FreeMemory(*buffer)
      ProcedureReturn netid
      
  EndSelect
  
EndProcedure
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Danke schonmal bringt mir jetzt aber nicht besonders viel, da ich ja nicht weiß ob Proxy aktiviert sind und wenn ja was für Daten dieser hat.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Das findest du unter:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

ProxyEnable - Proxy aktiviert (REG_DWORD)
ProxyServer - ProxyServer IP:Port (REG_SZ)

Der Proxy-Server muss eigentlich ein HTTP-Proxy sein.
Mit dem Registry Codes die im Forum rumschwirren sollte der Rest kein Problem mehr sein.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Dann braucht das Programm aber Admin Mode unter Vista/Win7 oder ?
Gibts keine andere Möglichkeit ?

EDIT
OK selber testen bringt doch immer noch am meisten :D

Nur eine frage

Code: Alles auswählen

Procedure.s ReadReg(HKEY, Ort$, Var$)
 RetVal = RegOpenKeyEx_(HKEY, Ort$, 0, #KEY_ALL_ACCESS, @lhkey)
 cch = 255 : sValue$ = Space(255)
 lType = #REG_SZ
 lrc = RegQueryValueEx_(lhkey, Var$, 0, @lType, @sValue$, @cch)   
 RegCloseKey_(lhkey)
 ProcedureReturn sValue$
EndProcedure
Debug ReadReg(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable") 
Debug ReadReg(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer") 

Die Abfrage ob eine Proxy Verbinung an sind gibt mir kein Ergebnis zurück, liegt das an dem Typ ?
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

cxAlex hat geschrieben: [...]
Credits an den Autor
[...]
Danke! <)

Übrigens:
Wenn du anstatt #KEY_ALL_ACCESS, #KEY_READ nimmst, brauchst du auch keine Adminrechte.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

HeX0R hat geschrieben:
cxAlex hat geschrieben: [...]
Credits an den Autor
[...]
Danke! <)
Super Code :allright:.

Hab ihn mal schnell überarbeitet, Enable Explicit - kompatibel und ein paar andere Späße:

Code: Alles auswählen

; EnableExplicit

; InitNetwork()

Procedure IsIP(ip.s)
  Protected count, ret, i, a$, va
  ;ReturnValues :
  ;0 = no ip
  ;1 = IPv4 - IP
  ;2 = IPv6 - IP
  count = CountString(ip, ".")
  If count = 3
    ret = 1
  ElseIf count = 5
    ret = 2
  Else
    ProcedureReturn 0
  EndIf
  For i = 0 To count
    a$ = StringField(ip, i + 1, ".")
    va = Val(a$)
    If a$ = "" Or Str(va)<>a$ Or va>255 Or va<0
      ProcedureReturn 0
    EndIf
  Next i
  ProcedureReturn ret
EndProcedure

; führt einen DNS - Lockup aus
Procedure DNS_Lookup(Host$)
  Protected ret, *host.hostent
  *host = gethostbyname_(host$)
  If *host
    ret = PeekL(PeekL(*host\h_addr_list))
  Else
    ret = *host
  EndIf
  ProcedureReturn ret
EndProcedure

Structure ByteArray
  *b.b[0]
EndStructure

Procedure Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, type.l, username.s, userpass.s, timeout.l)
  Protected *buffer.ByteArray, netid, text$, user$, length, encoded$, check_timeout, Content$, Result, i, a$
  Protected hi, lo, ver, CD, Port, method, k, cont, reply, reserved, atyp, passver, status, cnts
  
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
  
  proxy_ip = IPString(DNS_Lookup(proxy_ip))
  ip_to_connect = IPString(DNS_Lookup(ip_to_connect))
  
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
  
  netid = OpenNetworkConnection(proxy_ip, proxy_port)
  
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
  
  Select type
      
    Case 0
      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
      
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
      
      If username And userpass
        user$ = username + ":" + userpass
        length = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
      
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout = ElapsedMilliseconds() + (timeout*1000) ; Timeout
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          Content$ = Space(14500)
          length = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      Result = 0
      cnts = CountString(Content$, Chr(10))
      For i = 1 To cnts
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 1
      ;====================
      ;Socks4 - Proxy
      ;====================
      
      ;Socks4 only supports IPv4 !
      ;You have to do a DNS-Lookup before using this on urls, otherwise it will fail!
      If IsIP(ip_to_connect)<>1
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;Phase 1 SOCK4
      ;Send Request
      *buffer\b[0] = 4
      *buffer\b[1] = 1
      hi = Int(port_to_connect/256)
      lo = port_to_connect-(256*hi)
      *buffer\b[2] = hi
      *buffer\b[3] = lo
      For i = 1 To 4
        *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
      Next i
      PokeS(*buffer + 8, username)
      length = 9 + Len(username)
      SendNetworkData(netid, *buffer, length)
      ;Check if connection is established
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          ReceiveNetworkData(netid, *buffer, 1024)
          ver = *buffer\b[0] & 255
          CD = *buffer\b[1] & 255
          port = (*buffer\b[2] & 255)*256
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>0 Or CD<>90
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      ;IP and Port should be the same like ip_to_connect/port_to_connect and is just for information
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 2
      ;====================
      ;Socks5 - Proxy
      ;====================
      
      ;Phase 1 SOCK5
      ;Send wished method
      If username = "" And userpass = ""
        length = 3
        *buffer\b[0] = 5
        *buffer\b[1] = 1
        *buffer\b[2] = 0
      Else
        length = 4
        *buffer\b[0] = 5
        *buffer\b[1] = 2
        *buffer\b[2] = 0
        *buffer\b[3] = 2
      EndIf
      
      SendNetworkData(netid, *buffer, length)
      ;Check if method is allowed
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 2)
          ver = *buffer\b[0] & 255
          method = *buffer\b[1] & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or method = 255
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      If method = 2
        ;Phase 2 SOCK5
        ;Send Username/Password (if allowed)
        *buffer\b[0] = 1
        *buffer\b[1] = Len(username)
        PokeS(*buffer + 2, username)
        k = 2 + Len(username)
        *buffer\b[k] = Len(userpass)
        PokeS(*buffer + k + 1, userpass)
        SendNetworkData(netid, *buffer, Len(userpass) + 1 + k)
        
        ;Check if Username/Password is accepted
        check_timeout = ElapsedMilliseconds() + (timeout*1000)
        Repeat
          Delay(10)
          If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
            ReceiveNetworkData(netid, *buffer, 2)
            passver = *buffer\b[0] & 255
            status = *buffer\b[1] & 255
            Break
          EndIf
        Until check_timeout<ElapsedMilliseconds()
        
        If check_timeout<ElapsedMilliseconds() Or passver<>1 Or status<>0
          FreeMemory(*buffer)
          CloseNetworkConnection(netid)
          ProcedureReturn #False
        EndIf
      EndIf
      
      ;Phase 3 SOCK5
      ;Send Connect-Request
      *buffer\b[0] = 5
      *buffer\b[1] = 1
      *buffer\b[2] = 0
      Select IsIP(ip_to_connect)
        Case 0
          *buffer\b[3] = 4
          *buffer\b[4] = Len(ip_to_connect)
          cnts = Len(ip_to_connect)
          For i = 1 To cnts
            *buffer\b[4 + i] = Asc(Mid(ip_to_connect, i, 1))
          Next i
          cont = 4 + i
          
        Case 1
          *buffer\b[3] = 1
          For i = 1 To 4
            *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
          Next i
          cont = 8
          
        Case 2
          *buffer\b[3] = 4
          For i = 1 To 6
            *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
          Next i
          cont = 10
          
      EndSelect
      
      hi = Int(port_to_connect/256)
      lo = port_to_connect-(256*hi)
      *buffer\b[cont] = hi
      *buffer\b[cont + 1] = lo
      SendNetworkData(netid, *buffer, cont + 2)
      
      ;Now Check the reply
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          length = ReceiveNetworkData(netid, *buffer, 1024)
          ver = *buffer\b[0] & 255
          reply = *buffer\b[1] & 255
          reserved = *buffer\b[2] & 255
          atyp = *buffer\b[3] & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or reply<>0 Or reserved<>0
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      FreeMemory(*buffer)
      ProcedureReturn netid
      
  EndSelect
  
EndProcedure
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

cxAlex hat geschrieben: Super Code :allright:.
Naja, ich würde einiges davon heute anders machen.
Aber ist ja auch nen 5 Jahre alter Code.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Mich würde ja intressieren wieso mein zusammengebastler Code nicht geht.


Habs mit verschiedenen Proxys versucht, als Ergebnis bekomme ich jedes mal 0 aus.

Meine weitere frage wäre jetzt, selbst wenn es gehen würde, wie würde ich an die Datei rankommen ?
Z.b http://purebasic.fr/german/templates/Ap ... _phpBB.gif

Code: Alles auswählen

InitNetwork()
Procedure.l Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, username.s, userpass.s, timeout.l)
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
 
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
 
  netid.l = OpenNetworkConnection(proxy_ip, proxy_port)
 
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
 

      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
     
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
     
      If username And userpass
        user$ = username + ":" + userpass
        length.l = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
     
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          Content$ = Space(14500)
          length.l = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      Result.l = 0
      For i = 1 To CountString(Content$, Chr(10))
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
      
      
      
    EndProcedure
    
    url$ = "http://purebasic.fr"
    ip$ = "138.246.99.250"
    port = 3127
Debug Proxy_Connect(ip$, port,url$, 80 ,"", "",10)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du kannst doch selbst schauen, was der Proxy von deinem Verbindungsversuch hält.
Dein genannter z.B. sagt:
138.246.99.250 hat geschrieben: HTTP/1.0 405 Method Not Allowed
Content-Type: text/html
Allow: GET

You are trying to use a node of the CoDeeN CDN Network. Your IP address is not recognized as a valid PlanetLab address, so your access to CoDeeN does not include all HTTP types [...]
Antworten