OpenNetworkConnectionEx() mit Timeout

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

N00B hat geschrieben:Mist :-(

Brauche ein Threadsicheres PB :-(

Somit bringt mir der Code 0 :(
Was hat der Code mit Threadsafe zu tun? -> garnichts.

Für Threadsicheres programmieren gibt es Mutex und die Option
"Thread-sicheres Executable erstellen"
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag von N00B »

Cool ein großes Danke mk-soft :allright:

Da ist der Code ja schon halbwegs pb4 fähig :allright:
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag von N00B »

mk-soft hat geschrieben:
N00B hat geschrieben:Mist :-(

Brauche ein Threadsicheres PB :-(

Somit bringt mir der Code 0 :(
Was hat der Code mit Threadsafe zu tun? -> garnichts.

Für Threadsicheres programmieren gibt es Mutex und die Option
"Thread-sicheres Executable erstellen"
Ja dieser Code nicht, aber ich will ihn ja integrieren in ein Programm das mit mehreren Threads arbeitet.

Das mit Mutex usw hab ich alles schon hingekriegt, wie gesagt ich hänge seit nem halben Jahr nur am Timeout fest :(
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Nicht richtig gelesen?

Mit den Code gehen keine PB Network befehle. Must alles selber Programmieren.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag von N00B »

OMG

Alles selber ? :freak:

Mein Englisch ist nicht grade das Beste, vor allem beim übern Artikel fliegen. :freak:
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

mk-soft hat geschrieben:AMD Athlon(tm) 64 X2 Dual Core Prozessor 4400+

Code läuft nicht unter PB v4.02 aber unter PB v3.94.
Liegt also nicht am Prozessor.
Alles klar !
Habe auf alten Rechner auch ein altes PB.
Darauf hatte ich nicht geachtet.

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

setsockopt

Mal testen ob es geht.

Code: Alles auswählen

InitNetwork()

Host$ = "www.purearea.net"

ServerID = OpenNetworkConnection(Host$, 80)

; Socket
socket = ConnectionID(ServerID)
time.l = 0
len.l = 4
; Zeiten auslesen - 0 ist wohl defaultwert
Debug getsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time, @len)
Debug "Receivetimeout: " + Str(time)
Debug getsockopt_(socket,#SOL_SOCKET, #SO_SNDTIMEO, @time, @len)
Debug "Sendtimeout: " + Str(time)

; Zeit setzen für Receive im millisekunden
time = 100
Debug setsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time,@len)
; Zeit überprüfen
time.l = 0
len.l = 4
Debug getsockopt_(socket,#SOL_SOCKET, #SO_RCVTIMEO, @time, @len)
Debug "Receivetimeout: " + Str(time)


If ServerID = 0
  MessageRequester("", "Timeout")
Else
  If SendNetworkString(ServerID, "GET / HTTP/1.1" + #CRLF$ + "Host: " + Host$ + #CRLF$ + #CRLF$)
    Response$   = Space($FFF)
    ResponseLen = Len(Response$)
    Repeat
      inLen = ReceiveNetworkData(ServerID, @Response$ + Pos, ResponseLen - pos)
      Pos + inLen
    Until inLen = 0 Or Pos = ResponseLen
    MessageRequester("", Response$)
  EndIf
  CloseNetworkConnection(ServerID)
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

mk-soft hat geschrieben:setsockopt

Mal testen ob es geht.
Hab ich schon vor ein paar Monaten. Das geht definitiv nicht mit connect_(). Da braucht man Non-Blocking-Sockets. setsockopt mit RCV_TIME und SND_TIME oder wie die heißen sind nur für die Pakete nach der Verbindungsherstellung.
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.
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag von N00B »

Ist echt deprimierend, selbst ihr die viel mehr Ahnung vom programmieren haben, finde keine Lösung. :(

All die Zeit und Arbeit die ich in mein Prog gesteckt hab sind umsonst.

Ich wollte ja schon auf Power Basic umsteigen(da kann man das Timeout direkt in ms angeben beim Befehl zum Aufbau einer Verbindung) so verzweifelt bin ich mittlerweile.

Aber das ist der Letzte Mist, um ein Hallo Welt Programm zu erstellen, im Fenster mit nem einfachen OK Button, braucht man zig Winapi Befehle und massig Code.(ich glaub nicht mal mit c++ bräuchte man halb so viel, nur um das Gerüst von einem Fenster mit Button Events zu erstellen)

Dazu keine Handbücher und Einstiegshilfen in Deutsch, geschweige den eine deutschprachige Community.

Und dazu noch ein super saftiger Preis.

130 €
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ist nicht ganz sauber, aber es funktioniert (Threadsafe aus mit PB 4.02):

Code: Alles auswählen

; Author: DarkDragon (15.07.2007)

Structure SCONNECT
  host.s
  port.l
  resultConnection.l
  timedout.b
EndStructure

Procedure ConnectThread(*connectData.SCONNECT)
  If *connectData
    *connectData\timedout         = 0
    *connectData\resultConnection = OpenNetworkConnection(*connectData\host, *connectData\port)
    
    If *connectData\timedout = 1 And *connectData\resultConnection <> 0
      CloseNetworkConnection(*connectData\resultConnection)
    EndIf
    
    FreeMemory(*connectData)
  EndIf
EndProcedure

Procedure OpenNetworkConnectionEx(ServerName.s, Port.l, Timeout)
  Protected *connectData.SCONNECT
  Protected startTime.l
  
  *connectData = AllocateMemory(SizeOf(SCONNECT))
  
  *connectData\host = ServerName
  *connectData\port = Port
  *connectData\resultConnection = 0
  *connectData\timedOut         = 0
  
  If CreateThread(@ConnectThread(), *connectData)
    startTime = ElapsedMilliseconds()
    While currentTime < Timeout And *connectData\resultConnection = 0
      Delay(1)
      currentTime = ElapsedMilliseconds() - startTime
    Wend
    
    If *connectData\resultConnection = 0
      *connectData\timedOut = 1
    Else
      ProcedureReturn *connectData\resultConnection
    EndIf
  Else
    FreeMemory(*connectData)
  EndIf
  
  ProcedureReturn 0
EndProcedure

InitNetwork()

Debug "www.hahahahahah13233423.net:80 will timeout (Or someone bought the domain):"
Debug OpenNetworkConnectionEx("www.hahahahahah13233423.net", 80, 3000)
Debug "purearea.net:80 won't timeout:"
Debug OpenNetworkConnectionEx("www.purearea.net", 80, 3000)

End
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.
Antworten