Seite 1 von 1

Client-Server-Anwendung... größe eingehender Daten ermitteln

Verfasst: 17.03.2012 12:44
von Sunny
Folgendes Problem:

Wenn der Befehl "NetworkServerEvent()" den Wert der Konstante "#PB_NetworkEvent_Data" enthält weiß ich ja, dass Daten zum empfang mittels "ReceiveNetworkData()" bereit stehen.
Ich möchte jetzt gern mal wissen, ob es möglich ist, die größe der bereitstehenden Daten zu ermitteln, bevor ich diese mit "ReceiveNetworkData()" empfange.

Re: Client-Server-Anwendung... größe eingehender Daten ermit

Verfasst: 17.03.2012 13:28
von STARGÅTE
normalerweise, sendest du ja bei deinen Daten die Länge vorweg mit.
Damit weißt du dann wie viel noch kommt oder schon angekommen ist.
Da die Daten eh alle "zusamen kleben" würde es keinen Sinn machen, vorher zu wissen, dass 1MB daten da ist und alles in einen Memory packt, der dann aber eh wieder auseinander genommen werden muss.

Re: Client-Server-Anwendung... größe eingehender Daten ermit

Verfasst: 18.03.2012 23:33
von Dark
Schau dir mal bei meinem Disconnect Event http://www.purebasic.fr/english/viewtop ... 12&t=42559 folgenden Block an:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    RetVal = ioctlsocket_(hSocket, #FIONREAD, @Length)
  CompilerElse
    RetVal = ioctl_(hSocket, #FIONREAD, @Length)
  CompilerEndIf
In Length steht nach dem Aufruf dann die Länge der verfügbaren Daten. Der Disconnect wird nämlich daran erkannt, das vom Betriebsystem ein Event ausgelöst wird, aber keine Daten vorhanden sind. Du musst nur in dem Code nachschauen was hSocket ist und die Werte der Konstanten übernehmen.

Dark

Re: Client-Server-Anwendung... größe eingehender Daten ermit

Verfasst: 19.03.2012 11:09
von mk-soft
TCP-IP überprüft nur ob die Verbindung Ok ist und der Datenblock ohne Fehler übertragen wurde.

Ob die gesamten Daten übertragen sind liegt in Obhut des Programmieres. Also Deine Aufgabe.
Wenn die Daten größer sind als die eingestellte MTU, etw 1300 Byte bei Internetverbindung, kommen mehrere Datenblöcke an.
Zum Beispiel bei Modbus Over TCP wird ein Header mit drei Worten übertragen.
1. Word: Transaction ID
2. Word: Protocol ID
3. Word: Datalen

Die ersten beiden worte werden als Kopie zurückgesendet. Im dritten Word steht die angehängte Datenlänge in Bytes.

FF :wink: