UDP-Protokoll

Für allgemeine Fragen zur Programmierung mit PureBasic.
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

UDP-Protokoll

Beitrag von fabulouspaul »

Hallösche.

Ich habe eine vermutlich eher allgemeine Frage:
Es gibt die Möglichkeit, von einem Programm (Minecraft-Server) per Netzwerkverbindung einige Daten abzufragen. Verwendet wird das UDP-Protokoll.
Das Handshaking um an den Server "anzudocken" ist eigentlich relativ trivial: man fordert ein Verbindungstoken an und bekommt dann ein 4 Byte-Token zurück das für einen gewissen Zeitraum gültig ist und mit dem man seine Queries legitimieren kann. Alles per UDP.
Das nötige Datenpaket an den Server senden ist einfach. Eine Anwort kommt auch postwendend, aber warum auch immer will der anfragende Client die Antwort nicht empfangen (ReceiveNetworkData()).
Ich habe also ein kleines Serverprogramm geschrieben um zu testen. Auch hier klappt das Empfangen der Antwort nicht. :bluescreen:
Spannend ist, dass wenn ich im Client und im Server von #PB_Network_UDP auf #PB_Network_TCP wechsle alles einwandfrei funktioniert.

Ich bin kein Netzwerkprotokoll-Crack, vermute aber mal, dass es ein generelles Problem beim Empfangen via UDP gibt, oder?

Hier mal der Bastel-Code von Server...

Code: Alles auswählen

*Buffer = AllocateMemory(1500)

OpenConsole()
PrintN("*** Test-Server ***")

If InitNetwork() = 0
  PrintN("  - Keinen TCP/IP-Sockel gefunden!")
  End
EndIf

server = CreateNetworkServer(#PB_Any, 25565, #PB_Network_UDP)
If server = 0
  PrintN("  - Server konnte nicht erstellt werden!")
  End 
EndIf

Repeat
  SEvent = NetworkServerEvent()
  If SEvent
    ClientID = EventClient()
    Select SEvent
      Case #PB_NetworkEvent_Connect
        PrintN("  -> Clientverbindung: " + IPString(GetClientIP(ClientID)) + ":" + Str(GetClientPort(ClientID)))
        
      Case #PB_NetworkEvent_Data
        PrintN("  -> Eingehende Daten von " + IPString(GetClientIP(ClientID)) + ":" + Str(GetClientPort(ClientID)))
        ReceiveNetworkData(ClientID, *Buffer, 1000)
        PrintN("  -> Empfangene Nachricht: "+PeekS(*Buffer))
        PrintN("  <- Antwort senden")
        SendNetworkString(ClientID, "Hier Server, was ist?")
        
      Case #PB_NetworkEvent_Disconnect
        PrintN("  -> Verbindung beendet") 
        Quit = 1
    EndSelect
  EndIf
Until Quit

Repeat
Until Inkey() <> ""

CloseNetworkServer(server)
CloseConsole()
End
...und Client

Code: Alles auswählen

Port = 25565
mcs_ip.s = "127.0.0.1"

*Buffer = AllocateMemory(1500)

OpenConsole()

PrintN("*** UDP-Verbindung testen ***")
PrintN("")

If InitNetwork() = 0
  PrintN("  - Keinen TCP/IP-Sockel gefunden!")
  End
EndIf

net_handle = OpenNetworkConnection(mcs_ip, Port, #PB_Network_UDP)
If net_handle = 0
  PrintN("  - Keine Verbindung möglich!")
  End
EndIf

PrintN("  Zieladresse: " + mcs_ip + ":" + Str(Port))
SendNetworkString(net_handle, "Hallo Server?")

Repeat
  laenge = ReceiveNetworkData(net_handle, *Buffer, 1500)
Until  laenge > 0 Or laenge = -1

If laenge = -1
  PrintN("  - Verbindung verloren!")
  End 
EndIf

PrintN("  Empfangene Antwort (" + Str(laenge) + " Bytes): " + PeekS(*Buffer))

Repeat
Until Inkey() <> ""

CloseNetworkConnection(net_handle)
CloseConsole()
End
Wie gesagt, ersetzt man UDP mit TCP klappt alles.

Hat jemand eine Idee?

Grüße,
Paul
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: UDP-Protokoll

Beitrag von STARGÅTE »

Das es mit TCP funktioniert ist wohl er zufall, denn du führst ReceiveNetworkData beim Client einfach aus, ohne zu wissen, ob es überhaupt Daten gibt.

Damit das ganze richtig funktioniert, musst du NetworkClientEvent(net_handle) aufrufen und eine Rückmeldung erhalten haben, die dir sagt, dass es auch Daten gibt.

Code: Alles auswählen

Repeat
	Select NetworkClientEvent(net_handle)
		Case #PB_NetworkEvent_Data
			laenge = ReceiveNetworkData(net_handle, *Buffer, 1500)
	EndSelect
Until laenge > 0 Or laenge = -1
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
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: UDP-Protokoll

Beitrag von fabulouspaul »

Da hat mich der Zufall wohl auf die falsche Fährte gelockt (TCP)! :roll:

Hab es direkt mal ausprobiert und schon klappt es auch mit UDP.

Danke für die schnelle Hilfe! :praise:
Antworten