[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

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: 8808
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.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

Hier mal was zum hängen des Programms, bei ReceiveNetworkData:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
When a socket is created, it operates in blocking mode by default.

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
    
    Delay(1)
   
  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  
  s = ConnectionID(ConnectionID)
  arg = 1
  ioctlsocket_(s, #FIONBIO, @arg)
  *DatenPuffer = AllocateMemory(100)
  Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 10) ; without received data programm wait forever
  MessageRequester("PureBasic - Client", "Ergebnis: " + Str(Ergebnis), 0)
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag von Sicro »

NicTheQuick hat geschrieben:
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.
NicTheQuick, er meint damit keinen gemieteten Server von einem Provider, sondern "CreateNetworkServer". Demzufolge meint er mit "an eine IP binden", festlegen zu können, mit welcher Netzwerkkarte/IP die Verbindung stattfinden soll. :)

Siehe WinAPI-Funktion "bind":
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
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 »

@funkheld
Ich nutze doch gar kein echtes "Netzwerk" , sondern nur die LoopBackadresse. Netzwerkt ist auch ok.
Und der CLIENT hängt sehr wohl.

@NickTheQuick:
Und es ist diese "binding" gemeint, den Server also an eine bestimmte Netzwerkkarte und damit IP zu binden. Ich habe auf meinem Server zwei Netzwerkkarten und der Server sollte wenn möglich nur die Verbindungen der einen annehmen.

@-chris-
Englisch ist nicht meine Sache. Kann das also nicht komplett verstehen. ISt auch nicht wichtig,
da ich zuerst dieses Problem in der Fehlersektion zur Hilfe schrieb(http://www.purebasic.fr/german/viewtopi ... 39#p302139). Es steht nun mal in der Hilfe, das der Rückgabewert bei PB -1 ist, wenn etwas nicht klappt. und die selbe Funktion verhält sich am Server anders als beim Clienten. So steht das leider nicht in der Hilfe. Ob nun die Hilfe falsch ist oder ein fehler in PB weiß nur das PB Team. Nach der Hilfedatei aber stimmt das Verhalten nicht mit dem geschriebenen überein.

Bei deinem code läuft es durch, was auch immer der Aufruf ändert. Aber fakt ist, das hier halt ein fehler in PB oder der PB-Hilfe vorliegt.

zu deinen drei Zeilen code: wenn ich NUR AM CLIENTEN immer nach jedem erstellen einer Verbindung deinen Code aufrufe, dann sollte alles laufen? PB hat dann wohl auf der Clientseite genau das vergessen.
Ich hoffe nur, es der Code bringt die "disconnect-routing" von purefan und dark(player) nicht durcheinander.

@Sicro
Ich hatte die zweite Seite mit Antworten und deine erst gesehen, nachdem ich das andere schon geschrieben hatte.

Ich möchte natürlich danken für die Hilfe. Ich weiß nun ja, das hier was nicht stimmt. Jetzt muß wohl das PB-Team rann und klären.

Toshy
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 »

@- chris -:
If ConnectionID
s = ConnectionID(ConnectionID)
arg = 1
ioctlsocket_(s, #FIONBIO, @arg)
*DatenPuffer = AllocateMemory(100)
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenPuffer, 10) ; without received data programm wait forever
MessageRequester("PureBasic - Client", "Ergebnis: " + Str(Ergebnis), 0)
CloseNetworkConnection(ConnectionID)
Else
MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
1. Sag mal, muß ich diesen Socketaufruf vor jedem "ReceiveNetworkData()" aufrufen oder nur einmal nach Aufbau der Verbindung?
2. Welchen Type muß die Variable "arg" haben? Long oder Integer? Ob immer 4 Byte oder auch mal 8 wäre schon wichtig. oder reicht gar nur ein Byte?
3. ;uß variable "s", also der Socket ein long oder Integer sein?

ich will nur unter 32-bit und 64-bit zukünftig den richtigen Typ übergeben.
Danke
Toshy
1. Win10
PB6.1
Antworten