Kann asynchronen Download nicht abbrechen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Beefi
Beiträge: 88
Registriert: 16.01.2017 17:38

Kann asynchronen Download nicht abbrechen

Beitrag von Beefi »

Hi liebe Forengemeinde,

ich bräuchte mal wieder eure Hilfe. Ich lade über die Prozedur ReceiveHttpFile() eine Datei asynchron herunter und möchte den Download bei Bedarf abbrechen können.
Die Datei wird in einen Ordner im temporären Verzeichnis des Benutzers (Windows) geladen. Dieser Ordner im temporären Verzeichnis wird jedoch auch für andere Aufgaben des Programms verwendet und dementsprechend vorher immer gelöscht.

Das Problem ist...ich kann den Download einfach nicht abbrechen und die Datei bleibt immer gesperrt, sodass die ganze Applikation crasht und abstürzt.

Könnt ihr mir einen Tip geben, wie ich einen asynchronen Download abbrechen kann (wenn möglich mit Bordmitteln) und die unfertige Datei danach sofort beseitigen kann?
Versuche ich den Download mit AbortHTTP() abzubrechen und die Datei anschließend mit FinishHTTP() frei zu geben, passiert nichts.
Selbst nach diesen Befehlen bleibt die Datei gesperrt...und wenn ich lange genug warte, wird sie tatsächlich auch noch komplett und korrekt heruntergeladen, obwohl nach AbortHTTP() sofort ein #PB_Http_Aborted per HTTPProgress() zurückgegeben wurde.

Ich benutze PureBasic 5.44 LTS (x32 und x64) unter Windows 7 Pro x64...das Problem tritt mit beiden Architekturen auf.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Kann asynchronen Download nicht abbrechen

Beitrag von Sicro »

Schön wäre es gewesen, wenn du einen Beispiel-Code bereitgestellt hättest...

Hier mal ein ausführlichen Beispiel-Code, der bei mir keine Probleme bereitet. Getestet habe ich ihn jedoch unter Linux, da ich derzeit kein Windows zur Verfügung habe.

Code: Alles auswählen

InitNetwork()

OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 5, 5, 100, 30, "Download")

Repeat
  Event = WindowEvent()
  
  If Event = #PB_Event_Gadget
    Select GetGadgetText(0)
        
      Case "Download"
        
        File$ = GetTemporaryDirectory() + "myDownload"
        URL$  = "http://ftp.fau.de/mint/iso/linuxmint.com/stable/18.1/linuxmint-18.1-cinnamon-64bit.iso"
        HttpConnection = ReceiveHTTPFile(URL$, File$, #PB_HTTP_Asynchronous)
        If HttpConnection
          Debug "Download läuft..."
          SetGadgetText(0, "Stoppen")
        Else
          Debug "Download konnte nicht gestartet werden"
        EndIf
        
      Case "Stoppen"
        
        AbortHTTP(HttpConnection)
        Debug "Download wird gestoppt..."
        DisableGadget(0, #True)
        
    EndSelect
  EndIf
  
  If HttpConnection
    Select HTTPProgress(HttpConnection)
        
      Case #PB_Http_Success
        
        Debug "Download erfolgreich beendet"
        FinishHTTP(HttpConnection)
        HttpConnection = 0
        SetGadgetText(0, "Download")
        
      Case #PB_Http_Aborted
        
        Debug "Download wurde abgebrochen"
        FinishHTTP(HttpConnection)
        HttpConnection = 0
        DisableGadget(0, #False)
        SetGadgetText(0, "Download")
        
      Case #PB_Http_Failed
        
        Debug "Download ist fehlgeschlagen"
        FinishHTTP(HttpConnection)
        HttpConnection = 0
        SetGadgetText(0, "Download")
        
      Default
        
        Debug Str(FileSize(File$)) + " Bytes bereits heruntergeladen"
        
    EndSelect
  EndIf
  
  Delay(10)
Until Event = #PB_Event_CloseWindow
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Kann asynchronen Download nicht abbrechen

Beitrag von TheCube »

Habe es mal unter Win7 32-Bit PB5.60 angetestet ... das Beispiel läuft aber nicht ganz rund.
Starten und abbrechen klappt gut, selbst wenn meine Firewall dazwischengrätscht wirds sauber gestoppt.
Aber der Downloadfortschritt wird nicht angezeigt.
.......
.......
0 Bytes bereits heruntergeladen
0 Bytes bereits heruntergeladen
Download erfolgreich beendet


Und wenn man das Programmfenster schliesst gibt es "[ERROR] Invalid memory access".
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Kann asynchronen Download nicht abbrechen

Beitrag von Sicro »

Ich habe nochmal nachgesehen und festgestellt, dass HTTPProgress() ebenfalls die bereits empfangenen Bytes zurück gibt.
Der Code oben kann also wie folgt abgeändert werden:

Code: Alles auswählen

HttpProgress = HTTPProgress(HttpConnection)
Select HttpProgress

Code: Alles auswählen

Default
       
  Debug Str(HttpProgress) + " Bytes bereits heruntergeladen"
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Kann asynchronen Download nicht abbrechen

Beitrag von TheCube »

Danke, funktioniert jetzt schon ganz gut.
Nur, wenn man einen Download abbricht und dann Button Download erneut klickt gibt es bei

Code: Alles auswählen

HttpConnection = ReceiveHTTPFile(URL$, File$, #PB_HTTP_Asynchronous)
einen Invalid memory access (Read error at ...)
Threadsafe aus an habe ich probiert ... keine Änderung.
Beefi
Beiträge: 88
Registriert: 16.01.2017 17:38

Re: Kann asynchronen Download nicht abbrechen

Beitrag von Beefi »

Hi,

vielen Dank schon mal für die Antworten.
Ich habe es auch mal kurz mit der Version 5.60 getestet...da lief es. Das restliche Programm lief jedoch sehr unstabil und brachte ständig Fehlermeldungen, sodass ich wieder auf 5.44 LTS runter musste.

Mein Problem ist exakt das gleiche, wie es bei TheCube auftritt.
Läd man eine Datei herunter, so bleibt diese auch nach Abbruch des Downloads mit 0 kb trotzdem existent und gesperrt. Man kann sie auch nichtmal löschen, weil sie wohl noch in Verwendung ist. Und manchmal wird die Datei auch einfach weiter geladen...das merkt man auch, wenn du nach Abbruch des Downloads die Internetverbindung kappst...dann friert das komplette Programm ein :(


EDIT:
Gerade nochmal mit der neuen Version 5.60, da funktioniert es doch nicht. Man kann den Download abbrechen und das Programm denkt auch so...er läuft aber trotzdem weiter. Wenn man während des Downloads die Netzverbindung trennt und dann erst den Download abbricht, dann friert die gesamte Anwendung ein.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Kann asynchronen Download nicht abbrechen

Beitrag von GlassJoe »

Beefi hat geschrieben:Hi liebe Forengemeinde,

ich bräuchte mal wieder eure Hilfe. Ich lade über die Prozedur ReceiveHttpFile() eine Datei asynchron herunter und möchte den Download bei Bedarf abbrechen können.
Die Datei wird in einen Ordner im temporären Verzeichnis des Benutzers (Windows) geladen. Dieser Ordner im temporären Verzeichnis wird jedoch auch für andere Aufgaben des Programms verwendet und dementsprechend vorher immer gelöscht.

Das Problem ist...ich kann den Download einfach nicht abbrechen und die Datei bleibt immer gesperrt, sodass die ganze Applikation crasht und abstürzt.

Könnt ihr mir einen Tip geben, wie ich einen asynchronen Download abbrechen kann (wenn möglich mit Bordmitteln) und die unfertige Datei danach sofort beseitigen kann?
Versuche ich den Download mit AbortHTTP() abzubrechen und die Datei anschließend mit FinishHTTP() frei zu geben, passiert nichts.
Selbst nach diesen Befehlen bleibt die Datei gesperrt...und wenn ich lange genug warte, wird sie tatsächlich auch noch komplett und korrekt heruntergeladen, obwohl nach AbortHTTP() sofort ein #PB_Http_Aborted per HTTPProgress() zurückgegeben wurde.

Ich benutze PureBasic 5.44 LTS (x32 und x64) unter Windows 7 Pro x64...das Problem tritt mit beiden Architekturen auf.
Hier getestet mit PB 5.24 LTS ! und Threadsave an ! kein Unicode !

Ich Bitte die Syntax zu Entschuldigen ! Dieser WinAPI HTTP Connection mit Timeout, Code Snippet ist eigentlich
für Private Zwecke!

Er ist unübersichtlich und lang (funktioniert aber hervoranged) und sieht schrecklich verschachtelt und kompliziert aus, aber er ist so geschrieben, daß kein Proxy der Welt es schafft den Code hängen zu lassen so das kein Timeout ausgelöst wird (Idle Proxys versuchen das ! Ich hasse die dinger) und da kann der blöde Kasten sich noch so sehr anstrengen !

Der Code kennt 2 Arten von Timeout, Connection & Replie Timeout, ich hab mir den vor 6-7 Jahren (als PB noch kein Timeout drauf hatte) mühevoll das erste mal zusammen gefrickelt, und über die Jahre nur für mich optimiert (soweit ich den Code verstanden hab...blöde winapi und sockets, so kompliziert der Käse) :lol:

Desshalb auch kein Declare und nur die allernötigste Kommentierung im Code, ah und unter jaPBe geschrieben, desshalb
auch [ statt diese hässlichen C artigen Affen Klammern -> { die ich auf den Tot nicht austehen kann !

Code: Alles auswählen

  
  Global gracefull, abort_download
  
  Global own$=GetCurrentDirectory()
  
  
  #SuccessSound=0
  
  InitNetwork()
  If InitSound()
    LoadSound(#SuccessSound,"c:\WINDOWS\Media\notify.wav") 
  EndIf
  
  CreateRegularExpression(0,"[0-9]")
  
  ;[/ Winsock Konstanten
  Global sof10038$
  Global sof10052$
  Global sof10053$
  Global sof10054$
  Global sof10060$
  Global sof10061$
  
  Debug #WSAEWOULDBLOCK
  Debug"WENN 10035 DANN IST ALLES OK -> Empfangs Schleife läuft noch"
  Debug ""
  
  Debug #WSAENOTSOCK
  sof10038$="Error: Socket Operation on Non-Socket -> Error Code #10035"
  Debug sof10038$
  Debug ""
  
  Debug #WSAENETRESET 
  sof10052$="Network Dropped Connection on Reset -> Error Code #10052"
  Debug sof10052$ 
  Debug ""
  
  Debug #WSAECONNABORTED
  sof10053$="Software Caused Connection Abort -> Error Code #10053"
  Debug sof10053$ 
  Debug ""
  
  Debug #WSAECONNRESET
  sof10054$="Connection Reset by Peer -> Error Code #10054"
  Debug sof10054$ 
  Debug ""
  
  Debug #WSAENOTCONN
  sof10057$="Socket is not connected -> Error Code #10057"
  
  Debug #WSAETIMEDOUT
  sof10060$="Connection Timed Out -> Error Code #10060"
  Debug sof10060$ 
  Debug ""
  
  Debug #WSAECONNREFUSED
  sof10061$="Connection Refused -> Error Code #10061"
  Debug sof10061$ 
  Debug ""
  
  ;]
  
  Procedure SuccessWatch(egal)
    Repeat
      Delay(5)
      If gracefull 
        If IsSound(#SuccessSound)
          PlaySound(#SuccessSound)
          Delay(3000)
          gracefull=0
          Break
        EndIf 
      EndIf
    ForEver
  EndProcedure
  
  Procedure.i OpenNetworkConnectionEx(ConNameOrIP.S,ConPort,TimeOut.i,ReplieTimeout.i,use_proxy,Domain,CompletteURL.S,Referer$)
    
    Type.i = #PB_Network_TCP
    
    Auth_User$=GetURLPart(CompletteURL.S, #PB_URL_User)
    Auth_Pass$=GetURLPart(CompletteURL.S, #PB_URL_Password)
    
    If Auth_User$ And Auth_Pass$
      Combo.S = Auth_User$+":"+Auth_Pass$
      OutputAuth$ = Space(256)
      Base64Encoder(@Combo.S,Len(Combo.S), @OutputAuth$, 255)
      U_P$ = "Authorization: Basic "+OutputAuth$+#CRLF$
    EndIf  
    
    Parameters$=GetURLPart(CompletteURL.S, #PB_URL_Parameters)
    Param_CHK=CountString(CompletteURL.S,"?")
    If Param_CHK
      Parameters$="?"+Parameters$ 
    EndIf
    
    Header_Site$=GetURLPart(CompletteURL.S, #PB_URL_Site)  
    Header_Port$=GetURLPart(CompletteURL.S, #PB_URL_Port)  
    Header_Path$=GetURLPart(CompletteURL.S, #PB_URL_Path) 
    
    If use_proxy And Domain = 1
      ConNameOrIP.S = StringField(GetGadgetText(6),1,":")
      ConPort = Val(StringField(GetGadgetText(6),2,":"))
      Debug "PX=TRUE | DOMAIN = TRUE"
      bla1$="GET "+CompletteURL.S+" HTTP/1.1"+#CRLF$ ;/ GEHT AUCH MIT NUR PATH+PARAM, ABER VIELE PX GEHEN SO BESSER !
      bla2$="Host: "+Header_Site$+#CRLF$ 
    ElseIf use_proxy And Domain = 0
      Debug "PX=TRUE | Domain = FALSE"
      ConNameOrIP.S = StringField(GetGadgetText(6),1,":")
      ConPort = Val(StringField(GetGadgetText(6),2,":"))
      bla1$="GET /"+CompletteURL.S+" HTTP/1.1"+#CRLF$ ;/ GEHT AUCH MIT NUR PATH+PARAM, ABER VIELE PX GEHEN SO BESSER !
      bla2$="Host: "+Header_Site$+":"+Header_Port$+#CRLF$ 
    ElseIf use_proxy = 0 And Domain = 1
      Debug "PX=FALSE | DOMAIN = TRUE"
      bla1$="GET /"+Header_Path$+Parameters$+" HTTP/1.1"+#CRLF$
      bla2$="Host: "+Header_Site$+#CRLF$
      ConPort = 80
    ElseIf use_proxy = 0 And Domain = 0
      Debug "PX=FALSE | DOMAIN = FALSE"
      bla1$="GET /"+Header_Path$+Parameters$+" HTTP/1.1"+#CRLF$
      bla2$="Host: "+Header_Site$+":"+Header_Port$+#CRLF$ 
    EndIf
    
    Debug "------------1--------------"
    Debug "ConNameOrIP.s="+ConNameOrIP.S 
    Debug "ConPort="+Str(ConPort)
    Debug "---------------------------"
    
    DisableGadget(1,1)
    buffer_l.i = 65536 : *buffer_p = AllocateMemory(buffer_l)
    
    *wri=AllocateMemory(buffer_l) 
    
    ;[/ Create Socket
    Protected WSAD.WSADATA, TV.TIMEVAL, Addr.SOCKADDR_IN, *HostInfo.HOSTENT, Write_FD.FD_SET
    Protected S.i, Switch.i, retval.i, ConIP.S
    
    TV\tv_sec = TimeOut : Switch = #True
    
    If WSAStartup_($101,@WSAD)
      ProcedureReturn #False
    EndIf
    
    *HostInfo = gethostbyname_(@ConNameOrIP)
    If *HostInfo
      ConIP.S = StrU(PeekB(PeekL(*HostInfo\h_addr_list)),#PB_Byte) + "."
      ConIP.S + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 1),#PB_Byte) + "."
      ConIP.S + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 2),#PB_Byte) + "."
      ConIP.S + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 3),#PB_Byte)
      ;/ 0 vor PB 5.11 #PB_Byte ab PB 5.11
    EndIf 
    
    S = SOCKET_(#AF_INET,#SOCK_STREAM,#IPPROTO_TCP)
    Error.i = WSAGetLastError_() 
    If Error.i : Debug "---1---" : Debug Error.i : EndIf
    
    If S = #SOCKET_ERROR : WSACleanup_() : ProcedureReturn #False : EndIf
    
    ioctlsocket_(S,#FIONBIO,@Switch)
    Error.i = WSAGetLastError_()
    If Error.i : Debug "---2---" : Debug Error.i : EndIf
    
    With Addr
      \sin_addr = inet_addr_(ConIP.S)
      \sin_port = htons_(ConPort)
      \sin_family = #AF_INET
    EndWith
    
    With Write_FD
      \fd_count = 1
      \fd_array[0] = S 
    EndWith
    
    ;]
    
    ;[/ HTTP HEADER
    bla3$="Pragma: no-cache"+#CRLF$
    bla4$="User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.13) Gecko/20070216"+#CRLF$ 
    bla5$="Accept-Language: en-us,en;q=0.7,de-de;q=0.3"+#CRLF$ 
    bla6$="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,*/*;q=0.5"+#CRLF$
    bla7$="Accept-Charset: utf-8,*;q=0.7"+#CRLF$
    Bla8$="Referer: "+Referer$+#CRLF$ 
    Bla9$="Connection: close"+#CRLF$ 
    Bla10$=#CRLF$
    ;]
    
    ;Debug bla1$
    ;Debug bla2$
    
    ;[/ Send and Receive
    If Len(U_P$) > 2
      Debug U_P$ 
      message.S=bla1$+bla2$+bla3$+bla4$+bla5$+bla6$+bla7$+Bla8$+Bla9$+U_P$+Bla10$
    Else
      message.S=bla1$+bla2$+bla3$+bla4$+bla5$+bla6$+bla7$+Bla8$+Bla9$+Bla10$ 
    EndIf
    
    Debug message.S
    
    send_len=Len(message.S)
    kill_time = ElapsedMilliseconds()
    kill_time = kill_time+ReplieTimeout
    input_end_size=0
    
    connect_(S,@Addr,SizeOf(Addr)) 
    Error.i = WSAGetLastError_()
    If Error.i <> 10035
      Debug Error.i 
    EndIf
    
    Debug "XXXXX="+message.S
    Debug "----"
    Repeat
      retval = select_(0,0,@Write_FD,@Write_FD,@TV)
      Error.i = WSAGetLastError_()
      If Error.i : Debug Error.i : EndIf
      If retval
        send.i = send_(S,@message,send_len,0)
        If send.i > 0
          
          AddGadgetItem(2,-1,"-> Receive")
          
          Repeat
            
            run_time = ElapsedMilliseconds() : Delay(1)
            received.i=recv_(S,*buffer_p,buffer_l,0)
            Error.i = WSAGetLastError_()
            
            If Error.i <> 10035 And Error > 0
              Debug Error
            EndIf 
            
            If received.i > 0
              
              ;/ SEHR WICHTIG -> WriteData(DATEI,*buffer_p,buffer_l) benutzen statt WriteString sonst
              ;/ ungenaue Replies !
              
              kill_time = kill_time+ReplieTimeout
              
              input_end_size=received.i
              
              *buffer_p = ReAllocateMemory(*buffer_p,received.i)
              
              If HeaderFound=0
                jumbo$=(PeekS(*buffer_p,buffer_l)) 
                header_end=FindString(jumbo$,#CRLF$+#CRLF$,1)
                If header_end
                  jumbo$=ReplaceString(jumbo$,#CRLF$,"|") : jumbo$=Left(jumbo$,header_end-9)
                  AddGadgetItem(2,-1,"One Line Header with Replaced Line Break Char =>"+jumbo$)
                  AddGadgetItem(2,-1,"----------------------------------------------")
                EndIf 
                ;[/ Create TMP File -> CUT HEADER -> Rewrite Data to Destination File
                CreateFile(1,"C:\NEW.exe.tmp") : WriteData(1,*buffer_p,received.i) : FileSeek(1,header_end+3) 
                *fmem=AllocateMemory(40000) 
                If CreateFile(2,"C:\NEW.exe")
                  FileBuffersSize(2,1160)
                  While Eof(1)=0
                    Result=ReadData(1,*fmem,40000) : WriteData(2,*fmem,Result)
                  Wend
                EndIf 
                CloseFile(1) : DeleteFile("C:\NEW.exe.tmp")
                ;]
                HeaderFound=1 
              Else
                WriteData(2,*buffer_p,received.i) 
              EndIf
              ;out=1
            ElseIf received.i = 0
              Debug "DISCONNECT"
              If input_end_size=0
                AddGadgetItem(2,-1,"SHIT PROXY SEND 0 BYTE DATA")
              Else
                Debug "GRACEFULL DISCONNECT" : gracefull=1
              EndIf
              out=1 
            ElseIf run_time >= kill_time
              AddGadgetItem(2,-1,"FORCE:"+sof10061$) : out=1
            ElseIf received <= 0
              ;Debug "------------"
              If Error=#WSAEWOULDBLOCK
                ; when non-blocking: no more data to read 
              Else
                ; otherwise a real problem
                Debug ("Error "+Str(Error))
                ;[/ Winsock Error Auswertung
                If Error.i = 10052 
                  AddGadgetItem(2,-1,sof10052$)
                ElseIf Error.i = 10053
                  AddGadgetItem(2,-1,sof10053$)
                ElseIf Error.i = 10054 
                  AddGadgetItem(2,-1,sof10054$)
                ElseIf Error.i = 10057
                  AddGadgetItem(2,-1,sof10057$)
                ElseIf Error.i = 10060
                  AddGadgetItem(2,-1,sof10060$)
                ElseIf Error.i = 10061
                  AddGadgetItem(2,-1,sof10061$)
                Else
                  undef_sock_msg$=Str(Error.i)
                  AddGadgetItem(2,-1,"Undef:"+undef_sock_msg$) 
                EndIf
                ;]
                out=1
              EndIf
            EndIf
            *buffer_p = ReAllocateMemory(*buffer_p,buffer_l)
          Until out=1 Or abort_download = 1
        Else
          Error.i = WSAGetLastError_()
          error_code$=Str(Error.i) 
          If Error.i = 10057
            AddGadgetItem(2,-1,"Sending Fail: Error Code #10057 - Socket is not connected") 
          Else
            AddGadgetItem(2,-1,"Sending Fail: Error Code #"+error_code$)
          EndIf
          out=1
        EndIf
      Else
        AddGadgetItem(2,-1,"TIMEOUT") 
      EndIf 
    Until retval >= 0 Or out = 1 
    
    FreeMemory(*buffer_p)
    Debug "-----------------------------" 
    closesocket_(S) : WSACleanup_() : out=0
    
    ;]
    
    If IsFile(2)
      CloseFile(2) ; Close Destination File 
    EndIf
    
    DisableGadget(1,0)
    
  EndProcedure
  
  Procedure.l IpOrDomainCheck(in.S)
    
    tmp_str1$ = GetURLPart(in.S,#PB_URL_Site)
    If tmp_str1$
      For tmp_p = 1 To Len(tmp_str1$)
        tmp_str2$ = Mid(tmp_str1$,tmp_p,1)
        If MatchRegularExpression(0,tmp_str2$) = 0
          If FindString(tmp_str2$,".") = 0
            tmp_domain = 1 : Debug "DOMAIN TRUE" : Break 
          EndIf
        EndIf
      Next
    EndIf
    
    ProcedureReturn tmp_domain 
    
  EndProcedure
  
  Procedure connector (blablablabla)
    
    Referer$=GetGadgetText(4)
    
    url$=GetGadgetText(3) : url$=RemoveString(url$,"http://") : url$="http://"+url$
    
    Domain =  IpOrDomainCheck(url$) ; 1 1=Domain
    
    TimeOut=Val(GetGadgetText(7)) : use_proxy = GetGadgetState(5) 
    
    ConHost$=GetURLPart(url$,#PB_URL_Site) : ConPort=Val(GetURLPart(url$,#PB_URL_Port))
    
    AddGadgetItem(2,-1,"")
    id.i = OpenNetworkConnectionEx(ConHost$,ConPort,TimeOut,5000,use_proxy,Domain,url$,Referer$) 
    
  EndProcedure
  
  #blub=#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
  If OpenWindow(0,0,0,600,500,"Timeout Full Winapi Test",#blub) 
    
    CreateGadgetList(WindowID(0))
    
    ButtonGadget(1,200,350,100,20,"Start")
    EditorGadget(2,10,10,500,280)
    
    #default_url="http://mirrors.ircam.fr/pub/videolan/vlc/1.0.3/win32/vlc-1.0.3-win32.exe"
    StringGadget(3,10,400,480,20,#default_url)
    
    StringGadget(4,10,430,480,20,"http://www.google.com/");Referer
    CheckBoxGadget(5,200,320,100,20,"Use Proxy") : SetGadgetState(5,0)
    StringGadget(6,10,300,480,20,"110.76.38.173:6666");PROXY
    StringGadget(7,10,320,20,20,"5",#PB_String_Numeric);Server/Proxy CONNECTION Timeout
    
    ButtonGadget(8,340,350,100,20,"Stop") 
    
    Repeat
      
      WaitWindowEvent = WaitWindowEvent()     
      EventGadget     = EventGadget() 
      
      If WaitWindowEvent = #PB_Event_Gadget 
        
        If EventGadget = 1
          gracefull = 0 : abort_download = 0
          SoundTH=CreateThread(@SuccessWatch(),0) 
          hans=CreateThread(@connector(),1) 
        EndIf 
        
        If EventGadget = 8
          If IsThread(hans)
            abort_download = 1
            Debug "dsdasdsaldkölk"
          EndIf
        EndIf
        
      EndIf 
      
    Until WaitWindowEvent = #PB_Event_CloseWindow
    
  EndIf 
  ; jaPBe Version=3.13.4.880
  ; FoldLines=000F003C003E004A00FB0105011C012D01500160
  ; Build=0
  ; Language=0x0000 Language Neutral
  ; FirstLine=108
  ; CursorPosition=190
  ; EnableThread
  ; EnableXP
  ; ExecutableFormat=Windows
  ; CPU=1
  ; DontSaveDeclare
  ; EOF
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kann asynchronen Download nicht abbrechen

Beitrag von NicTheQuick »

Naja, dieser Code funktioniert natürlich nur mit HTTP. Ist also keine echte Lösung für Leute, die sicher mit ihrem Server kommunizieren wollen. Aber bei PB kann man ja auch nicht das Zertifikat überprüfen.
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Kann asynchronen Download nicht abbrechen

Beitrag von GlassJoe »

NicTheQuick hat geschrieben:Naja, dieser Code funktioniert natürlich nur mit HTTP. Ist also keine echte Lösung für Leute, die sicher mit ihrem Server kommunizieren wollen. Aber bei PB kann man ja auch nicht das Zertifikat überprüfen.
Ja leider geht der Spagetti Code nur mit http, ich weiss auch nicht was es mit diesem https auf sich hat, wieso das immer noch nicht in pb ist, ich hab schon Proxy Scanner gesehen die in uralt Delphi 6 geschrieben sind und https Support haben. Hätte PB https Support gehabt, oder ich einen https winapi Code der Timeout drauf hat, hätte ich gleich was geschrieben das die alten Delphi 6 Proxy Scanner in Rente schickt :mrgreen:
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten