Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Callback im UDT
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
CommLan



Anmeldungsdatum: 23.10.2015
Beiträge: 36
Wohnort: hinterm Mond

BeitragVerfasst am: 09.03.2019, 04:41    Titel: Antworten mit Zitat

@ThePuppetMaster:
Zitat:
Naja... ein Tut zu BW und UDP empfand ich bis jetzt als nicht nützlich, da beides eigentlich so simpel ist, das man da kaum etwas zu erklären kann, was nicht schon in den beispielen drin steht.


Hmm, ja gut. An die Beispiele der Projektseite hatte ich jetzt tatsächlich eher weniger gedacht (um nicht zu schreiben, es vergessen zu haben, dass es diese auch noch gäbe).

Zitat:
Das "Binden" hat in diesem fall allerdings auch eher den Zweck, das Socket an eine bestimmte Netzwerkkarte zu binden. Wenn du folglich merere Karten drin hast, haben Sie eine Lokale Adr. Diese Lokal-Adr ist faktisch die adr, welche du mit Bind der Karte zuordnen kannst.


Das man den Server damit an eine Netzwerkkarte bindet, ist mir tatsächlich schon klar. Ist auch ein Kernelement meiner Server, was grundsätzlich dabei ist. Werde ich später auch noch zwingend brauchen.
Was mir halt nur aufstößt ist die Tatsache, dass ich den Loopback als solchen nicht benutzen kann leider, da Hinz und Kunz mitlesen könnten, wenn die wöllten.

Aber wenn ich jetzt eine Karte mit 192.168.100.100 habe, kann ich ja trotzdem auch 192.168.100.100 hinschreiben, anstatt einer 127er, oder ?


Das Bezeichner - System leuchtet jetzt ein. Hab da echt nicht durchgesehen.

Bei mir ist das System eher so:
DIM AS INTEGER FUN_VAR_INT_CharCounter() AS INTEGER
DIM AS UDT_ServerInfo SUB_VAR_UDT_ServerInfo()
DIM SHARED AS STRING GLO_VAR_STR_SimpleString
#DEFINE DEF_Test 10
FUNCTION FUN_INT_ServerCreate(FUN_VAR_INT_Foo) AS INTEGER
SUB SUB_ServerClose(SUB_VAR_INT_Bar)
usw.

Ist zwar erheblich mehr Tipparbeit, aber belohnt einen mit weniger gescrolle und gesuche, da ich immer weiß, woher kommt meine Variable, was ist meine Variable und was macht die eigentlich.

Zitat:
Hä? ... was? .. wie? ... versteh ich nicht. Kannst du mir ein Beispiel-Code geben.?!

Okay, ich muss zugeben, ich hab jetzt im nachhinein herausgefunden, dass irgendwas in meinem Konstrukt instabil ist. Tut mir leid, dass ich erst TSNE im Verdacht hatte. Hatte es jetzt mit deinen originalen Beispielen ausgiebig getestet, da gehts scheinbar. Schon komisch, da sich strukturell bei mir eigentlich nix verändert hat. Mein Server bleibt aber bei TSNE_Create_Accept einfach genau eine Minute hängen, wenn er Daten vom Client (Nach erfolgter Verbindung) erwartet, aber vom Client nicht bekommt.
Um solch einen Client zu erzeugen, der meinen Server eine Minute in den Dornröschenschlaf schickt, musst du bei deiner test_client.bas auf deiner Projektseite, bevor das TSNE_Data_Send kommt, ein End 0 hinschreiben. Stirbt der Client schnell genug, wandert mein Server erstmal ins Timeout und ich hab absolut keinen Schimmer, warum. Spontan wirst du daraus mithilfe der magischen Glaskugel der IT - Welt auch nix sagen können, oder ?

Weshalb dieses Verhalten problematisch ist bei mir: Ich bastel an einem Projekt mit meinem Kumpel zusammen. Derjenige kommt aber mit Java um die Ecke. Problem: Dass da Streams aus irgendwelchen Gründen abbrechen, steht an der Tagesordnung. Problem ist halt nur, dass mein Server von Tagesordnungen generell nicht viel hält scheinbar.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1766
Wohnort: [JN58JR] DeltaLabs.de

BeitragVerfasst am: 09.03.2019, 11:40    Titel: Antworten mit Zitat

Bezüglich deiner Codierung ... hab ich irgend wo auch schonmal so gesehen .. da aber die IDE normalerweise (wenns ne halbwegs gutes ist) dir schon farblich anzeigt, ob es ne var oder ne sub / func ist (highlightning), kann an sich das "SUB" "FUNC" .. am anfang eigentlich sparen .. und, gleiches gilt für die var mit deren type auch .. mit der maus drauf oder dem cursor, sollte er eigentlich anzeigen, was für n type die is. daher spare ich mir auch die bezeichnung, und komprimiere mir das ganze runter.

Bezüglich kompression udn optimierung von app's hab ich auch mal n tut geschrieben, falls es dich interesiert: https://www.freebasic-portal.de/tutorials/optimierungen-98.html

Bezüglich deiner Problematik mit dem timeout ... Das ist wirklich schwierig zu sagen ... da es 60sec dauert, klingt es nach einem paket-timeout .. problem hierbei ist jedoch, das dieses timeout eigentlich nur für versendete daten zutrifft, und nicht für zu empfangende.

Das "Lokale" Timeout sollte daher nur in 2 Fällen eintreten.
* _Create_Client -> Diese "verbindungsanfrage" muss von der gegenstelle bestätigt werden (ACK)
* _Send_Data -> Hier allerdings erst nach einigen Paketen / nach einiger Zeit, da auch diese Datenpakete im puffer liegen, und durch das TCP Protokoll als "zu bestätigen, ansonsten nochmal senden" definiert ist.

Ein _Accept ist hiervon normalerweise nicht betroffen, was es eben unsere egenstelle ist, welche das ACK an den clienten sendet, und damit das letzte Paket im "verbindungsaufbau" ist.

Wenn du ein "TSNE_Wait_Close" nutzt, dann wartet tsne solange, bis dieverbindung beendet wurde, bevor das nächste kommando ausgeführt wird.

Das ist bei Verbindungen sinvoll, welche nach dem senden der Daten die verbindung trennt (z.B. HTTP). Bei allen anderen sollte man eher nach TSNE_IsClosed nutzen. Hier kehrt die Funktion sofort zurück, udn liefert einen Status der Verbindung zurück.

Leider ist das Debuggen derartiger Dinge recht schwierig. Aber, du kannst (wenn du TSNE als verdächtigen ausmachst, auch die Internen debug-routinen aktivieren, und dir dabei (extrem) viel Log ausgeben lassen. Die sind zwar eher für das THREADING gedacht, können aber dennoch helfen herauszufinden, wo etwas mehr zeit benötigt.

So grob in Zeile 222 gibt es einen Block mit DEBUG Definitionen, welche du aktivieren kannst. "#DEFINE _TSNE_DODEBUG_" usw.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ DeltaLab's ][ ToOFlo ][ BGB-Movie ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
CommLan



Anmeldungsdatum: 23.10.2015
Beiträge: 36
Wohnort: hinterm Mond

BeitragVerfasst am: 09.03.2019, 18:39    Titel: Antworten mit Zitat

@ThePuppetMaster
Naja, die Bezeichner hab ich mir mehr oder weniger über die Zeit ausgedacht. Ist halt angepasst an alle Bedürfnisse, die ich so entwickelt habe.
Die Sache ist - klar macht einem eine IDE das Leben recht einfach. Aber mir geht es zum einen darum, dass der Code auch unter widrigen Bedingungen (z.B. wenn keine IDE zur Hand ist) gut lesbar bleibt und die andere Sache ist, dass ich kein Windows mehr habe. Ergo fällt damit alles brauchbare nahezu weg. Zwar gäbe es noch Wine, aber wenn das Ding mal aus heiterem Himmel abkratzt - hab ich auch keine Lust drauf. Und aus einer VM die Daten rausbekommen, hallelujah.
Da find ich es einfacher und zuverlässiger, mit Geany umherzugurken und mit den einigen Highlightingfehlern / Bezeichnerlistenfehlern zu leben.

Das mit der Kompression / Optimierung schau ich mir auf jeden Fall gleich mal an, ist ein schöner Tipp.

Was das Timeout angeht, ich find es nicht. Ich hab gerade meine Lib wieder auf 400 Zeilen gekürzt und versuchs nochmal anders.
Die Frage, die sich mir da jetzt stellt - ist es vielleicht möglich, allen Callback - Funktionen die ServerID zusätzlich zu allen anderen Parametern mitzugeben anstatt nur der TSNE_NewConnection ? Das würde mir eine Menge Probleme sparen und mich auch erheblich beschleunigen in meiner Lib.
So kann ich z.B. jedem Server in meinem Statischen Array eine Unterstruktur gönnen, jeder Server bekommt eine eigene Clientliste, die Mutexe werden einfache / verhaken sich nicht mehr, man findet die Clients besser, Multithreading auf noch höherer Ebene und und und. Das würde mir das Leben sehr erleichtern.
Kannst da vielleicht irgendwas dran schraubern oder wäre dir das zu viel ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1766
Wohnort: [JN58JR] DeltaLabs.de

BeitragVerfasst am: 10.03.2019, 00:00    Titel: Antworten mit Zitat

Nö ... das is kein großer akt (PS: Die Übergebene TSNEID spiegelt den server wieder) ...

https://www.freebasic-portal.de/porticula/tsnev3-bi-1848.html

wie folgt zu verwenden:
Code:

#Define TSNE_SERVERSUBCALLBACK
#Include Once "TSNE_V3.bi"


aus
Code:

TSNE_NewConnection            as Sub  (ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String)


wird
Code:

TSNE_NewConnection            as Sub  (ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String, ByVal V_CallBackPtr as Any Ptr)


Gleiches gilt auch für die _Cancel Callback-Routine

_Create_Server und _WithBind kann jetzt als letzten Parameter ein AnyPtr aufnehmen und bei jedem Callback ausgeben.

Code:

TSNE_Create_Server            (ByRef R_TSNEID as UInteger, ByRef V_Port as UShort, ByRef V_MaxSimConReq as UShort = 10, ByVal V_Event_NewConPTR as Any Ptr, ByVal V_Event_NewConCancelPTR as Any Ptr = 0, ByVal V_StackSizeOverride as UInteger = TSNE_INT_StackSize, ByVal V_CallbackBackPtr as Any Ptr = 0) as Integer


Damit kannst du dir z.B. eine Linked-List basteln oder ein Mem per alloc erzeugen und den ptr über diese weise weiter reichen. Vorteil hier ist, das du eine mögliche array-List nicht mehr durchsuchen musst, sondern ganz einfach direkt per PTR auf diesen zugreifen kannst.

Aber, Ohne würds auch gehen zwinkern

Bezüglich IDE auf Linux kann ich dir nur "Kate" empfehlen .. das nutze ich auch und ist dank Yetifoot's FB Highlightning hervorragend geeignet.


MG
TPM
_________________
[ WebFBC ][ OPS ][ DeltaLab's ][ ToOFlo ][ BGB-Movie ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
CommLan



Anmeldungsdatum: 23.10.2015
Beiträge: 36
Wohnort: hinterm Mond

BeitragVerfasst am: 13.03.2019, 13:20    Titel: Antworten mit Zitat

Na das ist ja schon mal super, vor allen Dingen, wenns keine Umstände macht.
Ich mach das aber trotz allem ein wenig anders, weil wie du vielleicht schon gelesen haben dürftest - ich habs nicht so mit Pointern. Ich bastel mir aber stattdessen einfach mit nem Cast den Array - Index von einem Redim - Array da rein und hol mir den auf der anderen Seite wieder raus. Ist zwar nicht so ganz im Sinne des Erfinders, aber erstmal gehts.

Nur irgendwas stimmt da noch nicht so ganz, der Compiler schmeißt 2 Fehler:

TSNE_V3-9.bi(1703) error 1: Argument count mismatch, found ')' in 'TEvent.TSNE_NewDataUDP(TTSNEID, TIPA, T)'

TSNE_V3-9.bi(1873) error 1: Argument count mismatch, found ')' in 'Case Else: MutexUnLock(TSNE_INT_Mutex): If TEvent.TSNE_NewConnection <> 0 Then TEvent.TSNE_NewConnection(TTSNEID, TNSock, TIPA)'

Ich weiß nicht, ich hab das Gefühl, da fehlt noch ein #IFDEF in beiden Fällen. Kann mich aber auch täuschen. Weil in beiden Fällen fehlt hinten als letztes der Pointer, was ja logischerweise dann auch so im Compiler endet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1766
Wohnort: [JN58JR] DeltaLabs.de

BeitragVerfasst am: 13.03.2019, 14:17    Titel: Antworten mit Zitat

Jip, ... da hat was gefehlt ...

https://www.freebasic-portal.de/porticula/tsnev3-bi-1849.html


MfG
TPM
_________________
[ WebFBC ][ OPS ][ DeltaLab's ][ ToOFlo ][ BGB-Movie ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz