@Freak
Vielen Dank erstmal für deine ausführliche Antwort, sie hilft mir schon sehr beim Verständnis, trotzdem ist noch nicht alles geklärt. Unter anderm hast du meinen einen Beitrag wohl nicht gelesen.
Also dann:
Es ist natürlich super, denn es ist einfach, das der PB-Server die Events (vor allem die der Clienten) automatisch abfragt und einem dann Arbeit abgenommen wird. Aber wenn der Server nichts weiter macht, als man auf der Clientseite eh selber machen muß, also in einer Schleife abfragt ob ein Clientevent eingegangen ist, dann wäre es besser wenn man das selst übernehmen könnte. Denn es ist sehr wohl wichtig, schnell mitzubekommen, ob ein Client disconnectet wurde. Würde man das selber machen können, so wäre das in unterschiedlichen Threads möglich und es käme nicht zu den Problemen. Läuft es so wie jetzt, dann kann man einfach keine Programme schreiben die extreme Serverlast aushalten müssen (viele Connect, Disconnects). Denn wenn es so wie in dem Test abläuft (das ist bei meinem geplanten Programm mehr als realistisch) so würden ständig "Geisterverbindungen" bestehen die Ständig überwacht werden und an die auch ständig noch Daten gesendet werden obwohl sie nicht da sind.
Das ist defintiv nicht Vorteilhaft für einige anwendungen und sollte irgendwie geändert werden, oder die Möglichkeit bestehen, nach dem Connect diese "Clientverbindungen" selbst abzufragen, damit es nicht zu diesen Problemen kommt.
Aber da ich schon gesehen hatte (kurz bevor du geantwortet hast), das die ClientID auch erst dann wieder freigegeben werden, wenn das Disconnect übergeben wurde, also keine Überschneidungen auftreten, ist dies nur ein "Ärgernis der besonderen Art" für mich, aber wenigstens kann man damit vorläufig leben.
Nun aber zu dem, was nicht richtig sein kann und du übersehen hast.
SendNetworkData(), ist TCP nicht genau dazu da, zu überprüfen ob Daten auch korrekt übertragen wurden!!? Also das verstehe ich jetzt nicht. Aber auch hier stimmt was nicht. Denn wie ich hier schon schrieb kann das mit dem Rückgabewert nicht stimmen, wie kann SendNetworkData() denn bitte sagen, das die Daten korrekt versand wurden, wenn der Client teilweise schon für über einer Minute die Verbindung beendet hat? Man kann doch nicht sagen, das Daten an einen Clienten abgesendet wurden, der gar nicht mehr existiert, das geht soweit ich weiß bei TCP doch nicht. Und das sieht man indem man gleichzeitig (na ja, direkt nacheinander) SendNetworkData() und SendNetworkString() nutzt, denn SendNetworkString() gibt im Gegensatz zu SendNetworkData() eine Fehlermeldung aus. SNString() gibt dann zurück, das beim Senden der Daten ein Fehler auftrag, klar, der Client existiert teilweise seit Minuten nicht mehr. Also wie bitte kann erstens SendNetworkData() sagen das DAten korrekt abgesendet wurden, obwohl bereits beim übergeben des CONNECTevents der Client bereits wieder getrennt war und ZWEITENS wie ist es zu erklären das beide FUnktionen unterschiedliches ausgeben, das ist doch Quatsch aus meiner Sicht, bzw. ein Bug. Nur da alles nicht so "Ideal" ist, weiß ich natürlich nicht wo der Fehler liegt.
Also der Rückgabewert von SendNetworkData() ist aus meiner Sicht fehlerhaft und zwar hast du recht, das es natürlich einfacher ist, das man erstmal die direkt abfragbaren Serverevents ausgibt, als ständig ne Schleife zu durchlaufen ist schon klar, den es ist ressourcenschonend, ähnlich hätte ich es selbst auch gemacht, aber man darf dies nicht ohne eine Sicherheitsroutine machen. Es kann nicht sein, das theoretisch (und sogar problemlos in der praxis möglich) einige Disconnecs minuten oder stundenlang nicht angezeigt werden. Eine Idee von mir dazu wäre erstmal intern was "fest" einzufügen, was man vielleicht später durch eine Zusatzfunktion vom User beinflussen kann:
Einfach dafür sorgen, das mindestens alle X Sekunden (sagen wir mal anfang 5) die "Clientschleife" durchlaufen wird, selbst wenn Serverevents anliegen. So bekommt man wenigstens innerhalb einer festgelegten Zeit das Disconnect mit. Das dürfte sich wohl auch recht einfach intern regeln lassen.
Gruß und schon mal danke für deine immer sehr klaren Worte
Toshy
[edit]
hmm. ich habe weiter getestet und ich habe mich wohl etwas geirrt, aber das macht das Verhalten von PB nicht besser, nur auf eine andere Art unverständlich. Freak kann da aber wohl weiterhelfen.
Also der Unterschied zwischen SendNetworkString() und SendNetworkData() besteht wohl doch nicht, sondern es hangt nur davon ab, was zuerst verwendet wird. Man kann das einfach testen indem man die "Sendefunktionen" in der Reihenfolge austauscht bzw. auskommentiert:
Code: Alles auswählen
Select SEvent
Case 1
;MessageRequester("PureBasic - Server", "A new client has connected !", 0)
Debug "neuer Client: "+Str(ClientID)
string.s = "0123456789" + Space(1000*10000)
;Debug "SendNetworkString1: " + Str( SendNetworkString(ClientID, "fdsdfrwer") )
Debug "SendNetworkData1: " + Str( SendNetworkData(ClientID, @string, 10+1000*10000) )
Debug "SendNetworkData2: " + Str( SendNetworkData(ClientID, @string, 10+1000*10000) )
Debug "SendNetworkString2: " + Str( SendNetworkString(ClientID, "fdsdfrwer") )
Immer noch besteht das Problem, das die Daten angeblich korrekt (ab-)gesendet wurden sein sollen, obwohl das unmöglich ist, denn die Verbindung besteht schon längst nicht mehr. Also "bemerkt" die Sendefunktion nicht, das die Verbindung schon beendet ist ODER es wird bemerkt, nur die Errormeldung nicht weitergeleitet!? Was eigenartig ist, sendet man direkt nach diesem "fehlerhaften korrekten Senden"

nochmals was, dann wird korrekt zurückgegeben, das nichts gesendet wurde. Also irgendwas kann da nicht so ganz stimmen. Vielleicht hilft Freak dies etwas weiter.
1. Win10
PB6.1