Seite 5 von 5

Verfasst: 04.11.2007 17:15
von N00B
@DarkDragon & Sicro

Alle 3 Lösungen funzen :allright: und mir ist es egal welche schneller ist

:)

Wichtig ist nur, es funzt, und ich kann euch gar nicht genug Danken.

:praise: :praise: :praise: :praise:

Danke

Am liebsten würde ich euch dafür abknutchen :lol:

Verfasst: 07.01.2008 22:36
von N00B
@Sicro,


Hi Sicro :-)

Der Code funzt wunderbar, um einen Timeout zu empfangen.

Aber wie soll ich damit Daten (http replies,404 not Found Replies usw empfangen ?

Oder wo müsste der Code zum empfangen stehen ?

Hab den Code hier von dir benutzt.
Sicro hat geschrieben:

Code: Alles auswählen

EnableExplicit

InitNetwork()

Procedure OpenNetworkConnectionEx(ServerName.s,Port.l,TimeOut.l,Type.l = #PB_Network_TCP)
  Protected WSAD.WSADATA, TV.TIMEVAL, Addr.SOCKADDR_IN, *HostInfo.HOSTENT, Write_FD.FD_SET
  Protected S.l, Switch.l, Retval.l, ServerIP.s
  
  TV\tv_sec = TimeOut
  Switch = #True
  
  If Type = #PB_Network_UDP
    ProcedureReturn OpenNetworkConnection(ServerName,Port,#PB_Network_UDP)
  EndIf
  
  If WSAStartup_($202,@WSAD)
    ProcedureReturn #False
  EndIf
  
  *HostInfo = gethostbyname_(@ServerName)
  If *HostInfo
    ServerIP = StrU(PeekB(PeekL(*HostInfo\h_addr_list)),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 1),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 2),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 3),0)
  EndIf
  
  S = SOCKET_(#AF_INET,#SOCK_STREAM,#IPPROTO_TCP)
  If S = #SOCKET_ERROR
    WSACleanup_()
    ProcedureReturn #False
  EndIf
  
  ioctlsocket_(S,#FIONBIO,@Switch)
  
  With Addr
    \sin_addr = inet_addr_(ServerIP)
    \sin_port = htons_(Port)
    \sin_family = #AF_INET
  EndWith
  connect_(S,@Addr,SizeOf(Addr))
  
  With Write_FD
    \fd_count = 1
    \fd_array[0] = S
  EndWith
  Repeat
    Retval = select_(0,0,@Write_FD,0,@TV)
  Until Retval >= 0
  
  closesocket_(S)
  WSACleanup_()
  
  If Retval
    ProcedureReturn OpenNetworkConnection(ServerName,Port)
  EndIf
EndProcedure

#TimeOut = 1 ; in Sekunden
Define ID.l = OpenNetworkConnectionEx("www.purebasic.com",80,#TimeOut)
If ID
  Debug "Verbindung war erfolgreich"
  CloseNetworkConnection(ID)
Else
  Debug "Timeout oder Fehler"
EndIf
Mfg DerProgger
Und schon paar Stunden rumprobiert gehabt, aber leider nicht hingekriegt :(

Verfasst: 12.01.2008 00:58
von Sicro
Hallöchen N00B,
Aber wie soll ich damit Daten (http replies,404 not Found Replies usw empfangen ?
Mit ReceiveNetworkData()

Meine Prozedur prüft über die WinAPI nur ob eine erfolgreiche Verbindung aufgebaut werden kann. Ist dies der Fall, wird die OpenNetworkConnection() von PB aufgerufen. Also kann der Rückgabewert (die ID) meiner Prozedur normal mit den PB-Funktionen weiterverwendet werden, als hättest du OpenNetworkConnection() anstatt OpenNetworkConnectionEx() genommen.

Mfg Sicro

Verfasst: 24.01.2008 21:46
von N00B
Sicro hat geschrieben:Hallöchen N00B,
Aber wie soll ich damit Daten (http replies,404 not Found Replies usw empfangen ?
Mit ReceiveNetworkData()

Meine Prozedur prüft über die WinAPI nur ob eine erfolgreiche Verbindung aufgebaut werden kann. Ist dies der Fall, wird die OpenNetworkConnection() von PB aufgerufen. Also kann der Rückgabewert (die ID) meiner Prozedur normal mit den PB-Funktionen weiterverwendet werden, als hättest du OpenNetworkConnection() anstatt OpenNetworkConnectionEx() genommen.

Mfg Sicro
Ja ich weiss das mit ReceiveNetworkData natürlich :)

Aber das Problem ist, ich weiss nicht was ID deiner Prozedur ist, und von welcher Prozdur muss ich die nehmen ? :(

Wo ist da die ID deiner Prozedur :oops: ?

Code: Alles auswählen

OpenNetworkConnectionEx(ServerName.s,Port.l,TimeOut.l,Type.l = #PB_Network_TCP)
Und irgendwann hatte ich mal halbwegs was hingekriegt, und dann kammen Meldungen "bla Exciplit can only blaabla"

Oder so :(

EDIT:

Hab den Übliche ReceiveNetworkData Style

Code: Alles auswählen

  *mem=AllocateMemory(2000)

  Repeat
    
    blub = ReceiveNetworkData(id, *mem, 2000) 
    
    If blub > 0
      zeuch.s=PeekS(*mem)
      Debug zeuch.s
    Else
      Debug "-.-"
    EndIf
    
    FreeMemory(*mem)
    *mem=AllocateMemory(2000)
    
  Until blub = 0
  CloseNetworkConnection(id)
an allen möglichen Stellen ausprobiert, aber es ist immer das Selbe Problem :(
With 'EnableExplicit', variables have to be declared: *mem
und wenn ich declare einsetzen will, kommt das Nächste Problem, daß nicht umgangen werden kann, so weit ich das verstanden hab.
A arocedure name needs to start with a character (a-z or _)
:(

Und das EnableExplicit am Anfang des Codes braucht man warscheinlich, sonst hättest es ja nicht reingemacht.

Verfasst: 26.01.2008 19:19
von Sicro
N00B hat geschrieben:ich weiss nicht was ID deiner Prozedur ist
Der Rückgabewert (ProcedureReturn) der Prozedur (Procedure) OpenNetworkConnectionEx() ist die ID.
N00B hat geschrieben:und von welcher Prozdur muss ich die nehmen ? :(
Öhm... gibt ja nur eine: OpenNetworkConnectionEx()
N00B hat geschrieben:With 'EnableExplicit', variables have to be declared: *mem

und wenn ich declare einsetzen will, kommt das Nächste Problem, daß nicht umgangen werden kann, so weit ich das verstanden hab.

Und das EnableExplicit am Anfang des Codes braucht man warscheinlich, sonst hättest es ja nicht reingemacht.
Der Befehl "EnableExplicit" teilt dem Compiler mit das er rummeckern soll, wenn eine Variable nicht "declared" ist.

So muss jede Variable mit Define, Protected, Static oder Global "declared" werden. Schreibt man im Code dann mal eine Variable durch schnelles Schreiben etwas verdreht, meckert der Compiler dann gleich rum, dass die Variable nicht "declared" ist.

Code: Alles auswählen

Text.s = "Hello World"
Debug Text
gibt "Hello World" aus.

Code: Alles auswählen

Text.s = "Hello World"
Debug Txet
gibt hingegen "0" zurück, weil der neuen Variable "Txet" vom Typ "Long" (Long wird standardmäßig genommen, wenn kein Typ (.b, .l, .q usw.) angegeben wird) kein Wert zugewiesen wurde. Wenn man hier ganz oben "EnabledExplicit" angegeben hätte, würde der Compiler meckern und nicht schweigend den falschen Code verarbeiten.

Der Befehl "EnabledExplicit" ist also keine Pflicht.


Hier ein Beispiel wie man den Header einer Internetseite ermitteln kann.

Code: Alles auswählen

InitNetwork()

#TimeOut = 1 ; in Sekunden

ID = OpenNetworkConnectionEx("www.purebasic.com",80,#TimeOut) 
If ID
  *Buffer = AllocateMemory(1024)
  
  ; Request senden
  Request.s = "HEAD / HTTP/1.0" + #CRLF$
  Request   + "Host: www.purebasic.com" + #CRLF$ + #CRLF$
  SendNetworkString(ID,Request)
  
  ; Auf Antwort warten
  While Not NetworkClientEvent(ID)
    Delay(100)
  Wend
  
  ; Antwort ermitteln und ausgeben
  ReceiveNetworkData(ID,*Buffer,MemorySize(*Buffer))
  MessageRequester("Antwort",PeekS(*Buffer))
  
  CloseNetworkConnection(ID)
Else
  MessageRequester("Fehler","Timeout oder Fehler")
EndIf
Mfg Sicro

Verfasst: 31.01.2008 19:25
von N00B
Ok jetzt geht´s :)

Danke für die Infos.

Hatte schon nenn Header usw, nur hab ich den Fehler gemacht nicht erst nenn Header zu verschicken sondern dachte ich könnte nach dem Opennetworkconnectionex gleich abchecken was reinkommt :D

Es funzt, soweit.

Gibt nur ein altes Prob, wofür du absolut nichts kannst.

ReceiveNetworkDate lässt sich nicht breaken, oder irgendwie zu einem Timeout Forcen, ausser von Win seinem internen Timeout.

Nehmen wir mal ne lahme japanische Site, oder nenn überlasteten Idle Proxy Server.

100 Bytes werden empfangen, und irgendwann nach 10 Sek wieder ein bisschen usw aber wenn jetzt 100Bytes ankommen würden, und dann 20 Sek gar nichts, erst dann lässt es der Befehl sein, ewig rumzuwarten.

Also kann es unter Umständen ewig so weitergehen, immer häpchenweise, 100 Byte, dann wird wieder 20 Sek gewartet usw :(

Verfasst: 02.02.2008 22:35
von Sicro
N00B hat geschrieben:Hatte schon nenn Header usw, nur hab ich den Fehler gemacht nicht erst nenn Header zu verschicken sondern dachte ich könnte nach dem Opennetworkconnectionex gleich abchecken was reinkommt :D
Nach dem Aufruf von OpenNetworkConnection(Ex) bekommst du bei HTTP von der Gegenstelle keine Daten zugesendet. Erst wenn du einen Request sendest, werden dir Daten gesendet.
N00B hat geschrieben:ReceiveNetworkDate lässt sich nicht breaken, oder irgendwie zu einem Timeout Forcen, ausser von Win seinem internen Timeout.
Dass ReceiveNetworkData() eine Wartepause einlegt, wenn zu dieser Zeit keine Daten zum Abholen vorhanden sind, konnte ich noch nicht nachvollziehen, da mir auf die Schnelle kein lahmer Server zur Verfügung stand.

Du solltest aber auf jeden Fall mit NetworkClientEvent() vor dem Aufruf von ReceiveNetworkData() prüfen, ob überhaupt Daten zum Auslesen vorhanden sind, damit nicht ins Leere gegriffen wird.

Mfg Sicro

Verfasst: 03.02.2008 12:15
von lassma-asma
@ DarkDragon & Sirco

Auch von mir nochmal ein großes Lob ! Genau das hab ich gebraucht im Moment ...

Echt super Coeds ...

Danke nochmal !

Gruß lassma-asma

Verfasst: 03.02.2008 12:48
von PMTheQuick
WOW habe das auch erst gerade gesehen... Super Arbeit :allright: Und ich hatte mir selbst ne Netzwerk-Funktion gebastelt, welche diese URL aufruft:

http://web56.login-1.loginserver.ch/pmt ... &port=5007

z.B. ^^ So hatte ich immer den Server gecheckt (online / offline) aber die direkte PB-Variante ist natürlich besser...

Gruss
PMTheQuick ;)

Verfasst: 03.05.2008 17:06
von antonio99
Hier mal ein gleich einsetzbares Stück, mit zusätzlichem Receive Timeout :)

Ich hoffe ich konnte dem ein oder anderen damit helfen.

Code: Alles auswählen

  Global Content$ 
  Global Host$
  Global Referer$
  
  Global Bla1$
  Global Bla2$
  Global Bla3$
  Global Bla4$
  Global Bla5$
  Global Bla6$
  Global Bla7$
  Global Bla8$
  Global Bla9$
  Global Bla10$
  
  InitNetwork()
  
  Procedure OpenNetworkConnectionEx(ServerName.s,Port.l,TimeOut.l,Type.l = #PB_Network_TCP)
    
    Timeout$ = GetGadgetText(7)
    TimeOut.l = Val(Timeout$)
    
    Protected WSAD.WSADATA, TV.TIMEVAL, Addr.SOCKADDR_IN, *HostInfo.HOSTENT, Write_FD.FD_SET
    Protected S.l, Switch.l, Retval.l, ServerIP.s
    
    TV\tv_sec = TimeOut
    Switch = #True
    
    If Type = #PB_Network_UDP
      ProcedureReturn OpenNetworkConnection(ServerName,Port,#PB_Network_UDP)
    EndIf
    
    If WSAStartup_($202,@WSAD)
      ProcedureReturn #False
    EndIf
    
    *HostInfo = gethostbyname_(@ServerName)
    If *HostInfo
      ServerIP = StrU(PeekB(PeekL(*HostInfo\h_addr_list)),0) + "."
      ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 1),0) + "."
      ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 2),0) + "."
      ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 3),0)
    EndIf
    
    Debug ServerIP
    
    S = SOCKET_(#AF_INET,#SOCK_STREAM,#IPPROTO_TCP)
    
    If S = #SOCKET_ERROR
      WSACleanup_()
      ProcedureReturn #False
    EndIf
    
    ioctlsocket_(S,#FIONBIO,@Switch)
    
    With Addr
      \sin_addr = inet_addr_(ServerIP)
      \sin_port = htons_(Port)
      \sin_family = #AF_INET
    EndWith
    
    
    Debug Addr.SOCKADDR_IN\sin_addr
    Debug Addr.SOCKADDR_IN\sin_port
    
    Debug Addr.SOCKADDR_IN
    connect_(S,@Addr,SizeOf(Addr))
    
    With Write_FD
      \fd_count = 1
      \fd_array[0] = S
    EndWith
    Repeat
      Retval = select_(0,0,@Write_FD,0,@TV)
    Until Retval >= 0
    
    closesocket_(S)
    WSACleanup_()
    
    If Retval
      ProcedureReturn OpenNetworkConnection(ServerName,Port)
      
    EndIf
    
  EndProcedure
  
  
  If OpenWindow(0,0,0,600,500,"Timeout",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
    
    
    
    CreateGadgetList(WindowID(0))
    
    ButtonGadget(1,200,350,100,20,"Start") 
    EditorGadget(2,10,10,500,280)
    
    StringGadget(3,10,400,480,20,"http://wikipedia.de/");ZIEL
    StringGadget(4,10,430,480,20,"http://www.google.com/");REFERER
    CheckBoxGadget(5,200,320,100,20,"Use Proxy")
    
    StringGadget(6,10,300,480,20,"");PROXY
    StringGadget(7,10,320,20,20,"10",#PB_String_Numeric);Server/Proxy CONNECT Timeout
    
    
    Repeat
      
      WaitWindowEvent = WaitWindowEvent()     
      EventGadget     = EventGadget()
      
      If WaitWindowEvent = #PB_Event_Gadget
        
        
        If EventGadget = 1
          
          
          URL$=GetGadgetText(3)
          Referer$=GetGadgetText(4)
          
          url_total_len = Len(URL$)
          HOST_PART$ = Right(URL$, url_total_len -7)
          host_slash_pos = FindString(HOST_PART$, "/", 1)
          Host$ = Left(HOST_PART$, host_slash_pos-1)
          jaja = Len(HOST_PART$)
          Content$ = Right(HOST_PART$, jaja - host_slash_pos +1)
          
          Debug Content$+" Content"
          Debug Host$+" Host"
          Debug URL$+" URL"
          
          
          ;-HTTP HEADER
          If Proxy_Option = 1
            Bla1$="GET "+URL$+" HTTP/1.0"+#CRLF$;mit Proxy
          Else
            Bla1$="GET "+Content$+" HTTP/1.1"+#CRLF$ 
          EndIf
          Bla2$="Host: "+Host$+#CRLF$
          Bla3$="Connection: close"+#CRLF$
          Bla4$="Accept-Encoding: gzip"+#CRLF$
          Bla5$="Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1"+#CRLF$
          Bla6$="Accept-Language: en-us,en;q=0.7,de-de;q=0.3"+#CRLF$
          Bla7$="Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7"+#CRLF$
          Bla8$="User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.7.13) Gecko/20070216"+#CRLF$
          Bla9$="Referer: "+Referer$+#CRLF$
          Bla10$=#CRLF$
          ;-
          
          #TimeOut = 5 ; in Sekunden
          
          Proxy_Option = GetGadgetState(5) 
          
          If Proxy_Option = 1
            Proxy$ = GetGadgetText(6)
            KNOLLE = FindString(Proxy$,":",1)
            P_IP$ = Left(Proxy$,KNOLLE -1)
            Debug P_IP$
            
            Proxy_Len = Len(Proxy$)
            Final_Len = Proxy_Len - KNOLLE
            
            P_PORT$ = Right(Proxy$,Final_Len)
            Debug P_PORT$
            
            P_Port.l = Val(P_PORT$) 
            
            Define id.l = OpenNetworkConnectionEx(P_IP$,P_Port.l,#TimeOut);mit Proxy
            
          Else
            Define id.l = OpenNetworkConnectionEx(Host$,80,#TimeOut);ohne Proxy
            
          EndIf
          
          
          ;-              USER:Password
          ; InputCombo2$ = "hans:wurst"
          ; ComboLength2 = Len(InputCombo2$)
          ; OutputAuth2$ = Space(256)
          ; Base64Encoder(@InputCombo2$, ComboLength2, @OutputAuth2$, 255)
          ; U_P$ = "Authorization: Basic "+OutputAuth2$+#CRLF$
          ; Debug U_P$
          ;-
          
          If id
            
            Debug "-------SEND DATA--------"  
            Debug "---HTTP OUTPUT HEADER---"
            Debug Bla1$
            Debug Bla2$
            Debug Bla3$
            Debug Bla4$
            Debug Bla5$
            Debug Bla6$
            Debug Bla7$
            Debug Bla8$
            Debug Bla9$
            ;Debug U_P$
            Debug "------------------------------------"
            Debug ""
            SendNetworkString(id.l, Bla1$+Bla2$+Bla3$+Bla4$+Bla5$+Bla6$+Bla7$+Bla8$+Bla9$+U_P$+Bla10$)
            
            
            *mem1=AllocateMemory(4000)
            
            SetGadgetText(2,"")
            DisableGadget(2,1)
            
            Delay(500) 
            ;-DELAY TIMEOUT AFTER CONNECTION
            killer = 0 
            kill_val = 3999999 ;- ~5 Sek
            dat_end_size = 0
            ;-
            
            Repeat
              
              killer = killer + 1
              checker= NetworkClientEvent(id)
              
              If checker = #PB_NetworkEvent_Data
                
                If killer <= kill_val And checker >= 2
                  
                  Receive_Ergebnis = ReceiveNetworkData(id.l,*mem1,4000)
                  
                  If Receive_Ergebnis >= 1
                    
                    Debug "-----INCOMING DATA------"
                    
                    dat1$=PeekS(*mem1)
                    dat1$=LCase(dat1$)
                    
                    Debug dat1$
                    
                    dat_size=StringByteLength(dat1$)
                    dat_end_size = dat_size + dat_size
                    
                    
                    OK200_Status_Code = FindString(dat1$,"200 ok",1)
                    PW_401 = FindString(dat1$,"401 unauthorised",1)
                    
                    If OK200_Status_Code <> 0
                      
                      
                      AddGadgetItem(2,-1,dat1$,Spalte)
                      Debug ""
                      Debug " OK "
                      
                      FreeMemory(*mem1)
                      *mem1=AllocateMemory(4000)
                      Break
                      
                      
                    ElseIf PW_401 <> 0
                      
                      AddGadgetItem(2,-1,dat1$,Spalte)
                      Debug " "
                      Debug "User and Pass Required"
                      
                      FreeMemory(*mem1)
                      *mem1=AllocateMemory(4000)
                      Break
                      
                    EndIf
                    
                    
                    FreeMemory(*mem1)
                    *mem1=AllocateMemory(4000)
                    
                    
                  Else
                    
                    
                    If dat_end_size = 0
                      Debug "RECEIVED 0 BYTES"
                      Break
                      
                    Else
                      Debug "RECEIVED "+dat_end_size$+" BYTES"
                      Break
                      
                    EndIf
                    
                    
                  EndIf
                  
                ElseIf checker = 0 And killer >= kill_val
                  
                  Break
                  
                  
                EndIf
                
              ElseIf checker = 0 And killer >= kill_val
                
                If dat_end_size = 0
                  Debug "RECEIVE STATUS = TIMEOUT"
                  Debug "RECEIVED 0 BYTES"
                  DisableGadget(2,0)
                  
                Else
                  Debug "RECEIVE STATUS = TIMEOUT "
                  dat_end_size$ = Str(dat_end_size)
                  Debug "RECEIVED "+dat_end_size$+" BYTES"
                  DisableGadget(2,0) 
                  
                EndIf
                
                Break
                
              EndIf
              
              
              
              
            Until id = 0 Or killer >= kill_val
            
            
            Debug ""
            Debug "---------------------------------------"
            Debug "OPEN CONNECTION = war erfolgreich"
            CloseNetworkConnection(id)
            DisableGadget(2,0) 
          Else
            Debug ""
            Debug "---------------------------------------"
            Debug "OPEN CONNECTION = Timeout oder Fehler"
            SetGadgetText(2,"OPEN CONNETION = TIMEOUT")
            
          EndIf          
          
        EndIf
        
        
        
      EndIf
      
      
    Until WaitWindowEvent = #PB_Event_CloseWindow
    
  EndIf
  
  
  End