NetworkServerEvent() und #PB_NetworkEvent_File
Verfasst: 05.06.2012 07:52
Hi.
Ich hatte bisher nie SendNetworkFile() genutzt und damit auch nicht #PB_NetworkEvent_File.
Es paßt mir einfach von der Art her nicht. #PB_NetworkEvent_File habe ich zur Sicherheit natürlich abgefangen und eine eventuell datei in eine Dummydatei gespeichert. Es kann ja sein, daß eine Verbindung die nicht von meinem programm aufgebaut wird eine Datei liefert.
Ich hatte mir ansonsten darüber keine weiteren Gedanken gemacht und bin davon ausgegangen, das es sich beim Dateisenden um einen Teil des (TCP/)IP-Protokolls handelt. Irgendwie so etwas.
Da ich gerade meine threadbasierten Netzwerkroutinen ganz neu schreibe und da ganz genau auf Struktur und "sicherheit" im Programmcode achte, habe ich mal etwas getestet. Und soweit ich das sehe handelt es sich bei #PB_NetworkEvent_File und "sendnetworkfile" nichts weiter als um ganz normale Rohdaten wie auch bei #PB_NetworkEvent_Data. Es wird nichts weiter gemacht als als eine immer gleiche 8 Byte lange "Bytekette" gefolgt von einem long mit Inhalt der Dateigröße und dann gefolgt von den Dateidaten gesendet.
Nun besteht ja das Problem, das rein zufällig genau diese ersten 8 Bytes mit Daten übereinstimmen die ich erhalte. Zwar ist das unwahrscheinlich, aber nicht unmöglich.
Sicher nicht so super pralle. Wenn dem wirklich so ist, sollte man das in der Hilfe vermerken.
Denn dann kann man diesen Fehler ja "umgehen".
Entweder muß man darauf achten das bei eigenene Programmen nie der Wert 4993443410339512912 übermittelt wird. Was aber nicht einfach ist, da ich nicht weiß wie überwacht wird. Und man dann nach JEDEM byte überprüfen müßte, ab dort der quadwert nicht dem obigen Wert entspricht.
Einfacher und wie ich es wohl machen werde ist, bei einem #PB_NetworkEvent_Data-Evemt einfach die daten mit "receivenetworkdata()" auslesen. Ein gewissen Problem gibt es da aber schon. Da ich dann ja auch nicht sicher weiß ob es wirkich eine Datei oder "der Zufall" ist kann ich mir nicht sicher sein beim auslesen der Daten in Bezug auf die Länge. Ich lese dann einfach die länge ab position 9 aus, aber falls es nun doch "das zufällige Quad" war, dann wäre ich vielleicht unendlich lange auf alle daten, da sei nicht kommen. da es bei #PB_NetworkEvent_File aber im Gegensatz zu _Data nur einmal ein Event gibt, weiß ich noch nicht wie ich das sicher abhandeln soll.
Weiß jemand wie das intern genau abläuft und wie man sich da verhält?
Prüft pb beim Empfang nach jedem byte, nach jedem Long oder wie auch immer ob der Wert übereinstimmt?
Ich empfinde das als ein echtes Problem, selbst wenn es nur relativ unwahrscheinlich oder extremst selten eintritt.
Ach ja, bisher habe ich das nur den Empfang am Server getestet.
Gruß
Toshy
Nachtrag:
Auweia, nicht mal das ganz normale verwenden von "sendnetworkfile" klappt immer wenn die Pakete vielleicht häpchenweise oder so ankommen bzw. wenn der server irgendwie langsam reagiert. böse böse Falle.
Um das zu testen könnte ihr die beiden Vorlagen aus der Networklib nutzen. ihr müßt nur eine zeile ändern, den rest in beiden dateien so lassen.
In der NetworkClient.pb müßt ihr nur nach "sendnetworkstring()" zusätzlich noch "sendnetworkfile()" aufrufen, nehmt damit es sicher klappt eine kleine datei, ein paar Kilobyte groß.
Server starten, client starten und die Datei kommt nie als "dateievent" an.
Das liegt daran, das der nach den Stringdaten gleich die Dateidaten im Buffer liegen, nun kommt ein Dataevent. Da man ja nicht weiß wie viele Daten angekommen sind, werden im Beispiel bis 1000 Bytes ausgelesen, damit aber auch schon der Anfang der "Dateidaten". Und das wars dann mit "dateiempfang".
Der Dateiempfang an sich schein nur dann zu klappen, wenn die ERSTEN 8 Byte im TCP buffer mit dem obigen Wert überein stimmen. Dadurch kann es im Grunde nur selten klappen. Und es erhöht dafür auch die Wahrscheinlichkeit, das der Wert getroffen wird.
Ich bin jetzt wirklich mal gespannt, wie ich das Problem sicher ausschließen kann. Vermutlich gar nicht, nur "bestmöglich".
2. Nachtrag:
Vielleicht gibt es eine Möglichkeit um das Problem mit dem Dateiempfang zu umgehen. Aber dazu müßte die ASM oder Winsockspezialisten etwas schreiben.
Da der Data und Fileempfang an sich das selbe ist, braucht man an sich nichts weiter zu machen, als beim Fileevent nichts auszulesen. Aber man müßte dann nach "Case #PB_NetworkEvent_File" einfach "manuell" ein "DataEvent" auslösen. Also wenn möglich in der "Socketverarbeitung des Betriebssystems" oder in PB an der Stelle die das DataEvent auslöst einfach "nachträglich" das event auslösen. dann könnte man das ganz normal weiter verarbeiten. (nur darauf achten, das dadurch nicht parallel dazu wieder ein FileEvent ausgelöst wird. Wäre auch nicht so schlimm, dann müßte man halt nur nach dem Event mindestens ein Byte auslesen.