[uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Daten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

[uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Daten

Beitrag von Toshy »

Hallo Leute.

In den anderen Themen von mir beschäftige ich mich ja mal wieder etwas mit den Netzwerkfunkionen.
Dabei beschäftige ich mich vor allem auch mit den Disconnect Events am Clienten. Die Vorlage von Dark und purefan nimmt einem da ja an sich alles ab.
Nur so aus Interesse wollte ich jetzt aber mal was testen, denn in der Hilfe steht unter "ReceiveNetworkData"
Rückgabewert

Gibt die Anzahl an empfangenen Bytes zurück. Ist das 'Ergebnis' gleich der 'DatenPufferLänge', dann sind noch mehr Daten zum Einlesen verfügbar.
Ich wollte jetzt einfach mal zum Test auf einer bestehenden Verbindung ReceiveNetworkData() ausführen OHNE daß dort ein Event kam daß mich auf Dateneingang hinweist. Es liegen also keine Daten an. Nun dachte ich, daß dann einfach als Rückgabe NULL-Bytes angegeben werden. Aber nichts ist, die Funktion hängt.. Das Programm arbeitet nicht weiter (ich weiß nicht wie lange ob es beim Empfang von Daten weiter geht, noch nicht getestet).
Ist das Absicht oder ein Fehler?
Wann soll ReceiveNetworkData() denn dann bitte -1 übergeben? Denn wenn Daten anliegen werden die Daten ausgegeben, wenn nicht, also kein Event existiert, hängt die Routine.
Und was würde jetzt passieren, wenn sagen wir mal 100 Bytes anliegen, ich diese 100 Bytes auslesen und als Rückgabewert 100 erhalte. Laut hilfe bedeutet es, wenn der Rückgabewert gleich der Datenbuffer länge ist, noch Daten anliegen. Das tun sie dann ja nicht. An sich kein Problem wenn dann einfach beim nächsten auslesen -1 angegeben wird.

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  Debug "verbindung aufgebaut"
  *DatenPuffer = AllocateMemory(100)
  Repeat
    Debug "versuche daten zu empfangen"
    Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 1)
    Debug ergebnis
    Delay(3000)
    
  Until 0
  
  Debug "schleife verlassen"
  ;MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  ;SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
  
  ;MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  ;CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Debug "ende"
End   

Code: Alles auswählen

; http://www.purebasic.fr/german/viewtopic.php?f=8&t=23777&hilit=disconnect
;http://www.purebasic.fr/english/viewtopic.php?f=12&t=42559
;http://www.purebasic.fr/german/viewtopic.php?f=8&t=23445&hilit=disconnect+client
;
;http://www.purebasic.fr/german/viewtopic.php?f=16&t=25348&p=300584&hilit=disconnect#p300584
;

; --- Include
IncludePath  "C:\DATEN\Entwicklung.Purebasic.LocalCopy\Includes"
XIncludeFile "proceduren(2012).pbi" 
XIncludeFile "proceduren(2012).ThreadVerwaltung.pbi" 

IncludePath  "C:\DATEN\Entwicklung.Purebasic.LocalCopy\FremdInludes"
; XIncludeFile "Hook_NetworkClientEvent.pbi" 

IncludePath  "C:\DATEN\Entwicklung.Purebasic.LocalCopy\Network"
XIncludeFile "NetStruct.pb" 
XIncludeFile "NetIDVerwaltung.pbi" 
XIncludeFile "NetProc.pbi" 
XIncludeFile "NetThreadIncomingServerEvent.pbi" 

XIncludeFile "NetGlobalVar.pbi"

Debug "start"
; --- Variablen

Port = 6832
; --- Konstanten

InitNetwork.i = Proc_InitNetwork()

;CreateNetworkServer.i = Proc_CreateNetworkServer(Port, #PB_Network_TCP)
CreateNetworkServer.i = Proc_CreateNetworkServer(Port, #PB_Network_TCP, global_MemoryBlockSize_NetIDIncomingDataBuffer, global_MemoryBlockSize_NetIDOutgoingDataBuffer, global_NetworkDataBufferSize)



If proc_IsInitNetwork()
  
  Debug "ServerInit"
  
  If CreateNetworkServer <> 0
    Debug "Serverstart"
    ;proc_AddThread()
    Thread = CreateThread(@thread_NetworkServerEvent(), 0)
    ;proc_AddThread()
    ;Thread = CreateThread(@thread_server_network_CopyBuffers(), 0)
    
  Else
    error(0,"Server konnte nicht erstellt werden.")
    ; !!! vernümpftige Fehlerroutinge einbauen.
  EndIf
  
EndIf

  Debug "Warte auf Programmende"
  Delay(60000)
    Debug "Ende"
End   
So, jetzt habe ich einfach mal gewartet bis der Server geschlossen wird. Dann wird beim Clienten ReceiveNetworkData() verlassen. aber mit Rückgabewert 0, nicht -1.
Das paßt doch was nicht.
Kein Wunder, das bei meinem alten Code hin und wieder mal unerwartet was nicht klappt.
Nur daß es daran liegen könnte, hätte ich nicht gedacht.

so, nur mal dieser Code:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          SpeicherPuffer.s = "Hallo"
          Ergebnis = SendNetworkData(ClientID, @SpeicherPuffer, StringByteLength(SpeicherPuffer))

          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case #PB_NetworkEvent_Data
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
  
        Case #PB_NetworkEvent_File
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1
    
      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

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  Debug "verbindung aufgebaut"
  *DatenPuffer = AllocateMemory(100)
  Delay(3000)
  Repeat
    Debug "versuche daten zu empfangen"
    Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 10)
    If Ergebnis > 0
      PeekS(*DatenPuffer, 10)
    Else
      Debug "nix"
    EndIf
    Debug "Bytes = " + Str(ergebnis)
    Delay(3000)
    
  Until 0
  
  Debug "schleife verlassen"
  ;MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
  ;SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
  
  ;MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  ;CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Debug "ende"
End   
Wenn ich mich jetzt nicht total irre, dann läuft ReceiveNetworkData() zwar weiter, wenn dann später noch Daten komme oder die Verbindung beendet wird, aber nicht vorher. Und was in der Hilfe steht, stimmt überhaupt nicht. Wenn die Empfangenen Daten gleich der Größe de Buffers sind, dann liegen NICHT unbedingt noch Daten an. Das war mir ja schon seit Jahren logisch, womit ich aber nie gerechnet hatte ist, daß wenn man dann die Verbindung noch mal abfragt, das Programm hängt.

Das muß doch eher ein uralter Bug sein!

Denn ansonsten wußte mehr als deutlich in der Hilfe stehen:
Auf gar keinen Fall darf man ReceiveNetworkData() aufrufen, wenn keine Daten mehr anliegen. Und wenn die empfangene Datenmenge gleich der Buffergröße ist, dann werft eine Münze ob ich noch mehr Daten einlesen wollt.
Ok, denn zweiten Satz könnte man weg lassen in dem man einfach in der Hilfe den Teil mit "ddann sind noch mehr Daten zum Einlesen verfügbar"

Auf jeden Fall weiß ich nun, warum es hin und wieder mal zu mir bisher unerklärlichen Stopps im Programmablauf kam. Überl übel.

Ich bin jetzt mal gespannt und hoffe das ich hier einfach nur komplett was falsch getestet habe und meine alten "Stopps" an etwas Anderem liegen.

Gruß
Toshy
1. Win10
PB6.1
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von STARGÅTE »

Auf jeden Fall weiß ich nun, warum es hin und wieder mal zu mir bisher unerklärlichen Stopps im Programmablauf kam. Überl übel.
Dieses "Problem" hatte ich schon 2009 angesprochen:
Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Daher rufe ich immer sicherheitshalber einmal NetworkClientEvent() auf, und überprüfe lieber öfter mal, ob daten da liegen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von Toshy »

Ah je...
habe ich damals nicht mitbekommen. übel übel.
Ok, wenn man es weiß, dann muß man mehr aufpassen. aber gerade bei Threads kann das schon ein echtes Problem sein.



Und seit dem hat noch immer niemand etwas gemacht? Wenn ich nur richtig Englisch könnte. Ich muß echt mal im Englischen Forum mit googles Hilfe darum bitten, das die Fehler und Networkfunktionen mal ein echtes Update erhalten.

Aber zu erste werde ich mal den fehler in der Hilfe im entsprechenden deutschen Thema posten. DAnn müssen sie wenigstens die Hilfe ändern. Und wenn das dann das PB-Team erreicht... vielleicht... nach 7 Jahren... Update...

Ok, damit hast du mir jetzt soweit erst einmal geholfen. Jetzt bin ich zwar frustriert, aber weiß endlich woran es liegt. Ich sollte mich nicht zu sehr auf die Texte in der Hilfe verlassen. Einfach ausprobieren und schauen das der Rechner nicht explodiert ;-)
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von Toshy »

Noch mal ich, ja Doppelpost.
Falls du den anderen schon gelesen hast und es ja auch an sich etwas neus ist:

Im Bereich für "Fehler in der Hilfe" habe ich mich mal gemeldet und ich wollte überlegen, wie ich im englischen Forum was schreiben kann. Aber da habe ich gesehen, daß du dort auch bist. Kannst du denn da nicht mal auf die deutschen Themen hinweisen, nur halt es dort selbst ansprechen? Also den Fehler in ReceiveNetworkData() und im Grunde die Inhalte aud meinem Betrag zum Thema "Networklib Zukunft". Denn gerade das Disconnectevent am Clienten und IPv6, daß ganz besonderas, sind ja dringliche Themen.

Vielleicht kannst du da ja mal kurz zu ReceiveNetworkData() und IPv6 (http://www.purebasic.fr/german/viewtopi ... 3&t=25498) was schreiben und nebenbei die Links zu deinem alten und meinen neuen Beiträgen posten. Das ist sicher besser, als mit meinem 80%-Googleenglisch was zu versuchen.

Falls nicht, dann muß ich mich da mal durchquälen.

Danke
Toshy
1. Win10
PB6.1
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von STARGÅTE »

Ich bin der Meinung, es wurde auch schon offiziell (im englischen Forum) diskutiert, ich finde es nur leider gerade nicht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von Andre »

Ich fände es ehrlich gesagt, wesentlich sinnvoller, wenn jemand im (offiziellen) englischen Bug-Forum einen entsprechenden Eintrag samt nachvollziehbarem Code-Beispiel, was den Fehler zeigt, postet.

Die Anleitung "um den Fehler / die Unzulänglichkeiten herum" anzupassen, kann ja wirklich nicht die Lösung sein...

Fred hat sich in den letzten Wochen ja um hunderte gemeldete Bugs gekümmert --> insofern wäre entsprechender Eintrag im englischen Forum sehr wertvoll! Bei Bedarf kann ich ihn dann immer nochmal darauf hinweisen... :twisted:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von Toshy »

Ich denke, dann können wir hier ja erst einmal au Deutsch einen Betrag verfassen der alles wichtige über die Networkangelegenheiten beinhaltet, die wir schon seit Jahren untereinander ansprechen.
Als erstes natürlich der "Fehler".
Danach müssen wir schauen, ob da jemand besser als ich das ins Englische übersetzten kann.

Vorschlag:
1. ReceiveNetworkData()
Im deutschen Forum unter
http://www.purebasic.fr/german/viewtopi ... 18#p302218
http://www.purebasic.fr/german/viewtopi ... =3&t=20870
http://www.purebasic.fr/german/viewtopi ... &start=120
weißen wir auf ein Jahre altes Problem hin, daß noch immer nicht geklärt wurde.

Code: Alles auswählen

; server

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

If CreateNetworkServer(0, Port)
  
  Repeat
    
    SEvent = NetworkServerEvent()
    
    If SEvent
      
      ClientID = EventClient()
      
      Select SEvent
          
        Case #PB_NetworkEvent_Connect
          
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
          
          
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  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 = 6832
Repeat
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
  Delay(1000)
Until ConnectionID > 0
If ConnectionID
  *DatenPuffer = AllocateMemory(100)
  Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 10) ; without received data programm wait forever
  MessageRequester("PureBasic - Client", "", 0)
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf

End
Wird dieser Code ausgeführt, hängt das Programm solange bis Daten eintreffen oder ein Disconnectevent eintritt, was an sich am Clienten im Normalfall ja gar nicht abgefragt werden kann.
Die Hilfedatei ist entweder falsch oder die Funktion.

2. IPv6
In der Hilfe steht das man eine Verbindung per TCP aufbauen kann. Klappt dies auch mit IPv6? Falls ja, wie kann man die IP auslesen bzw. wann wird das endlich in PB eingearbeitet? Falls nein, wann kommt es endlich? IPv6 wird wird benötigt. Selbst das alte Windows XP unterstützt ja schon IPv6 seit langem.

3. Wie von vielen Programmierern in allen Sprachen fehlen viele zusätzliche "Parameter" bei den Netzwerkfunktionen. PB macht es einem schön einfach bei Netzwerkdingen, das ist super und so für viele einfacher und schneller zu handhaben. Aber Dinge wie das binden eines Servers an eine bestimmte IP / Netzwerkkarte wären echt wichtig.

4. DisconnectEvent
Warum gibt es in PB beim Clienten kein DisconnectEvent? Soweit ich das erlesen habe, gibt es das an sich. Auf jeden Fall gibt es einen "Zusatzcode" von purefan und dark(player) der genau dies erledigt. Wann erledigt das PB

5. Bei neuen bzw. erweiterten Netzwerkfunktionen und Parametern sollte die Community kurz nach Wünschen befragt werden. So wäre es da PB eigene ConnectionIDs verwendet sicher sinnvoll, das man diesen per Funktion / Befehl Daten zuordnen kann. Am besten je Verbindung ein einziger Pointer, der dann auf auf die eigenen Daten zur Verbindung zeigt. Dann braucht man nicht mal mehr eine eigene Verbindungsverwaltung für die IDs.

6. Allgemein und Zusammenfassend:
Ich bin dankbar für die einfach zu handhabenden Netzwerkfunktionen, aber wie es aussieht, wurde an denen seit 2005 nichts mehr drann gemacht. Nicht nur ich emfinde es als dringend, dich als aller nächstes diese Lib vorzunehmen. Vor allem aber wäre ich da sehr dankbar.

Lieber Gruß
Toshy


So, noch mal an Stargate und Andre und alle Anderen:
Mit der Übersetzung ins Englische bin ich überfordert. Kann ich englisch noch lückehaft etwas lesen (viel interpretieren und nicht wirklich verstehen), so klappt das mit dem sprechen oder schreiben gar nicht. Da ich es recht kurz gefaßt habe, kann das im Englischen natürlich auch in eigenen Worten geschrieben werden. Ist ja nur ein Entwurf.
Zuletzt geändert von Toshy am 28.05.2012 11:28, insgesamt 2-mal geändert.
1. Win10
PB6.1
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von Andre »

...ohne dass ich jetzt Zeit/Gelegenheit für eine Übersetzung gehabt hätte, habe ich einen Bug-Thread im engl. Forum mit Hinweis auf diesen Beitrag eröffnet:
http://www.purebasic.fr/english/viewtop ... =4&t=50078
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
funkheld
Beiträge: 647
Registriert: 31.12.2009 11:58

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von funkheld »

Hmm..., nach deiner Aussage wie du abfragst, hängt das Programm bei mir nicht.
Natürlich können Daten liegenbleiben und später abgeholt werden.
Da stimmt irgend etwas mit deinem Netzwerk nicht.


Gruss
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [uralt Bug?]ReceiveNetworkData-Aufruf ohne anliegende Da

Beitrag von NicTheQuick »

Toshy hat geschrieben:3. Wie von vielen Programmierern in allen Sprachen fehlen viele zusätzliche "Parameter" bei den Netzwerkfunktionen. PB macht es einem schön einfach bei Netzwerkdingen, das ist super und so für viele einfacher und schneller zu handhaben. Aber Dinge wie das binden eines Servers an eine bestimmte IP / Netzwerkkarte wären echt wichtig.
Was hat das mit Netzwerkbefehlen zu tun? Wenn du deinen Server an eine bestimmt IP binden willst, dann musst du das mit deinem Provider klären oder dyndns verwenden.
Antworten