Unter Druck setzen klingt so negativ.
Aber nach Jahren muß man doch mal was machen.
Langsam wundere ich mich nicht mehr, warum meine alten Codes manchmal eigenartiges Verhalten aufweisen.
Ich habe jetzt sogar bemerkt, das SendNetworkData() sehr wohl den Code blocken kann.
Baue ich nach dem ersten senden der 10 MB (die noch versendet werden) noch eine neue Verbindung auf und sende dort wieder 10 BM und dann noch eine Verbindung usw., dann gibt es immer zurück, das die daten GESENDET wurden, stimmt ja wohl nicht. Aber was schlimmer ist, irgend wann, bei mir aktuell ca. bei der 5. ten verbindunge stockt das programm bei SendNetworkData(). Ist der Buffer irgend wie voll (grob 50 mb) über 5 verbindungen, dann geht nichts mehr. es wird auch kein -1 zurück geliefert, das Programm stoppt bei SendNetworkData(). Was noch schlimmer ist, wenn ich die übertragunsbegrenzung von netlimiter aufhebe passiert es manchmal, das das programm weiter läuft und weiter sendet, meißt hängt es bei mir aber bis in alle ewigkeit. und damit meine ich genau die funktion Sendnetworkdata. manchmal kommt es wenn der Buffer (bei ca. 50 mb) voll ist, einfach keine neue Verbindung aufgebaut werden kann. mal ja, mal nein.
Da ist überhaupt keine verläßlichkeit drinn.
SICHERE Programme lassen sich damit ja gar nicht machen. Ich hatte damals was zum datei syncronisieren und bakups machen geschrieben. dabei wurden auch über 7 kbyte verbindungen daten übertragen. war kein problem, da wurde dann halt nebenbei über wochen viel versendet. jetzt aber erst verstehe ich, warum es dann öfter zu hängern kam. wenn SendnetworkData() sporadisch hängt.... das geht ja gar nicht.
Und wenn man angeblich 50 mb versendet hat, und das nicht stimmt, aber auch kein bufferfehler kommt, dann geht das auch nicht. man kann dannja nicht mal bei der gegenseite überprüfen was schon da ist. die verbindung ist dann ja blockiert.
Und da ich gerade DSL-Ausfall für einige ZEit habe, ist mir das erst jetzt richtig aufgefallen.
Wie PMV schon anmerkte ist TCP ja sicher, soll heißen, wenn man SendNetworkData() verwendet hat,
kann man davon ausgehen, dass die Daten auch "früher oder später" beim Clienten sind,
außer die Verbindung wird getrennt.
Und genau das sollte ja etwas anders sein, wen die meldung kommt, versendet, sollte das auch so sein. Und Buffer voll sollte auch kommen, wenn angekündigt.
Ich habe hier wie geschrieben aktuell 7 kb übertragungsrate im download (upload ca. das selbe. muß mal schauen). und 50 mb lassen sich übertragen, angeblich. aber ich , müßte jetzt 2 stunden warten um rausfinden zu können, ob die Daten wirklich angkommen sind. und verhindern kann ich das nicht. es gibt ja kein "Buffer voll" mit -1 wie es sein sollte bei ca. 64 kbyte.
Hier mal meine Ansätze zum senden (welche ich auch in meinen Spielen/Anwendungen nutze):
Für "normal größe" Daten (in meinem Fall Pakete) verwende ich eine Prozedur,
welche SendNetworkData nutzen, und bei unvollständigem Versand,
in abstand von einigen Millisekunden SendNetworkData() erneut mit dem Rest ausführt.
Also eine prozedur die u.u die Programmausführung kurz anhält.
Für "sehr größe" Daten verwende ich ein zusätzlichen Komunikations-Port,
aufdem mich die Clienten fortlaufend darüber unterrichten, wie viele Bytes angekommen sind,
von dem was versendet wurde. Erst bei übereinstimmung wird erneut SendNetworkData() ausgeführt.
In diesem Fall muss das ganze in einem Thread ausgelagert werden,
da der Sendevorgang auch mal mehrere Minuten dauern kann.
Ich hatte damals und jetzt etwas ähnliches, ich mache es nur optimierter neu. dazu arbeite ich auch mit Threads. ich bin noch nicht ganz fertig, aber damals war es ählich (und nutze es heute noch). Hauptprozess, und dann je einen Thread für Eventauslesen und datenempfang am server und als cliente (also 2 threads), einen für das senden der daten. also 3 Thread plus hauptprozess. dabei ist der Sendethread so konzepiert, das ich den mehrfach aufrufen kann (also mehrere sendethreads) und die dann selbständig die daten auf den Verbindungen senden. meine eigenen "sendnetworkdata"-routinen legen dabei die daten in einem eigenen buffer vorläufig ab. das sollte ersten sein um die 64 000 zu umgehen und auch große dateimengen im hintergrund senden zu können (meißt im ram, aber auch datei als buffer).
nur.... sende ich jetzt z.b. eine datei, wird die (über SendNetworkData()) in maximal 64 kb blöcken gesendet (der last wegen teste ich mit 2 byte-blöcken). und da ich gerade das dsl-problem habe, kam es mir gelegen, dann über das netzt auch mal auf meinen homeserver was zu senden. ups.... 50 mb in einer sekunde raus, und dann geht erst mal nichts. stunden warten um eine anweisung zu senden... ne ne.
einen zweiten Port an sich, also eine zweite Verbindung ist bei mir an sich nicht nötig gewesen. auf Grund eines eigenen Protokolls (das ich jetzt nur noch mal neu machen wollte) wird die Datei bzw. die Daten nicht in eins durchgesendet. in Paketen und an der Gegenstelle automatisch zusammen gesetzt. dadurch ist es absolut kein Problem zwischendurch andere Dinge zu senden, anweisungen, Chattexte oder sonst was. nur wenn es kein "Buffer voll" gibt und Daten im Ausgangspuffer auch mal Stunden benötigen bis sie ankommen ohne einen Fehler auszulösen... dann ist das nicht mehr wirklich zu händeln.
Ich sende also schon in Blöcken und habe ein eigenes Protokoll, da ber wo ohne das mein Programm es mitbekommen kann 50 mb in einem Buffer liegen und bei langsamen Verbindungen nichts passiert oder sogar die Funktion hängen bleibt... da kann nur das PB-Team etwas machen. Und vor allem soweit ich das in den Foren sehe, da schon teils seit JAHREN nach gefragt wird.
Allerdings das SendNetworkData() auch mal hängen kann ist wohl bisher nur mir augefallen.
Nochmals zum Schluß...
ich bin zwar nicht fertig mit dem code, ein teil aber ließ sich testweise auführen. und obwohl testweise 5 thread auf 5 verbindungen gesendet werden solten, hängten auf einmal ALLE Threads. .... was soll man da dann noch machen. dabei war ich so auf meine Codestruktur stolz, da an sich leistungsfähig.
Ich überlege gerade, ob ich nun komplett alles einmotte
Nachtrag:
Code: Alles auswählen
; server
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 6844
*Buffer = AllocateMemory(10000)
If CreateNetworkServer(0, Port)
Debug "server gestartet"
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
Debug "neuer client"
Case #PB_NetworkEvent_Data
ergebnis = ReceiveNetworkData(ClientID, *Buffer, 10000)
Case #PB_NetworkEvent_Disconnect
EndSelect
EndIf
Until Quit = 1
MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End
Code: Alles auswählen
; client
;
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 6844
*buffer = AllocateMemory(1024*1024*100)
For i = 1 To 10
Debug "versuche Verbindung aufzubauen"
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
Debug( Str(i) + ". Verbindung wurde aufgebaut")
Debug "versuche daten zu senden"
Ergebnis = SendNetworkData(ConnectionID, *buffer, 1024*1024*10)
Debug("daten gesendet = " + Str(ergebnis))
Else
Debug "Verbindung wurde nicht aufgebaut"
;MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Next
Debug "ende"
MessageRequester("PureBasic - Client", "Ende", 0)
;CloseNetworkConnection(ConnectionID)
mit dem Code und einer langsamen Verbindung ODER besser mit dem Programm netlimiter
http://www.netlimiter.com und die Verbindung auf 5 kbyte/sek gesetzt löst der obige Code unregelmäßig Programmhänger aus. löse ich die 5 kbyte/sek begrenzung nach einiger Zeit wieder, so das der Rest der Daten schnell versendet werden kann, werden auf einmal super schnell (localhost) die daten aus dem Buffer gesendet, aber Sendnetworkdata() hängt. aber das passiert unregelmäßig. schließe ich den Server, dann "bricht" auch SendNetworkData() ab bzw. geht weiter.
Ganz genau habe ich noch nicht rausgefunden, wann das passiert. manchmal geschieht das etliche Versuche nacheinander, dann einige Zeit gar nicht mehr. Aber ich kann den hänger immer mal wieder "nachproduzieren". Aktuell hängt es schon seit Minuten, obwohl keine Daten mehr übertragen werde.
1. Win10
PB6.1