UDP - keine daten vorhanden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

UDP - keine daten vorhanden

Beitrag von Moxl »

Halli Hallo :mrgreen:

ich wollte mich grade mal mit dem UDP protocol auseinander setzen und frage mich warum bei meinem folgendes server code keine daten angezeigt werden?

Server:

Code: Alles auswählen

Debug "server: initnetwork: "+InitNetwork()
Debug "server: createserver: "+CreateNetworkServer(0, 6500, #PB_Network_UDP)
Repeat
  Delay(20)
  event=NetworkServerEvent()
  Select  event
    Case  #PB_NetworkEvent_Connect
      Debug "server: client verbunden"
    Case  #PB_NetworkEvent_Data
      Debug "server: rohdaten empfangen"
      *crude=AllocateMemory(2048)
      bytes=ReceiveNetworkData(EventClient(), @crude, MemorySize(*crude))
      crude$=PeekS(*crude)
      Debug "server: "+Str(bytes)+" Bytes empfangen."
      Debug crude$
    Case  #PB_NetworkEvent_Disconnect
      Debug "server: client nicht mehr verbunden"
  EndSelect
ForEver
Client:

Code: Alles auswählen

Debug "client: initnetwork: "+InitNetwork()
verbindung=OpenNetworkConnection("localhost", 6500, #PB_Network_UDP)
Debug "client: opennetworkconnection: "+verbindung

Procedure a(verbindung)
  Repeat
    Delay(20)
    event=NetworkClientEvent(verbindung)
    Select  event
      Case  #PB_NetworkEvent_Data
        Debug "client: rohdaten empfangen"
      Case  #PB_NetworkEvent_Disconnect
        Debug "client: client getrennt"
    EndSelect
  ForEver
EndProcedure

If  verbindung<>0
  CreateThread(@a(), verbindung)
EndIf
OpenConsole()
Repeat
  input$=Input()
  If  input$<>""
    bytes=SendNetworkData(verbindung, @input$, Len(input$))
    Debug Str(bytes)+" Bytes wurden gesendet."
  EndIf
ForEver
Also laut den Rückgabewerten kommt das paket vollständig an... nur wenn ich jetzt wissen will was für ein string da gekommen ist zeigt er halt nichts an :(

weiß wer was da los ist?

danke schonmal im vorraus :allright:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: UDP - keine daten vorhanden

Beitrag von NicTheQuick »

'*crude' und 'crude' sind verschiedene Variablen. Ein 'EnableExplicit' am Anfang deines Codes wird Wunder bewirken.

Als Hinweis: '*crude' ist bereits ein Pointer. Da braucht es kein @ mehr.

Abgesehen davon, sind die 'Delay()'s auch falsch platziert. Die sollten, wenn überhaupt, nur aufgerufen werden, wenn das NetworkEvent Null war. Ansonsten wird es in jedem Schleifendurchlauf ausgeführt und das ist schlecht.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: UDP - keine daten vorhanden

Beitrag von ts-soft »

Das Len() bei SendNetworkData ist auch ungünstig, im Unicodemode kommt nur noch die Hälfte an :mrgreen:
Server:

Code: Alles auswählen

EnableExplicit

Debug "server: initnetwork: "+InitNetwork()
Debug "server: createserver: "+CreateNetworkServer(0, 6500, #PB_Network_UDP)
Define event, *crude, bytes, crude$

Repeat
  event=NetworkServerEvent()
  Select  event
    Case  #PB_NetworkEvent_Connect
      Debug "server: client verbunden"
    Case  #PB_NetworkEvent_Data
      Debug "server: rohdaten empfangen"
      *crude=AllocateMemory(2048)
      bytes=ReceiveNetworkData(EventClient(), *crude, MemorySize(*crude))
      crude$=PeekS(*crude)
      Debug "server: "+Str(bytes)+" Bytes empfangen."
      Debug crude$
    Case  #PB_NetworkEvent_Disconnect
      Debug "server: client nicht mehr verbunden"
    Case 0
      Delay(20)
  EndSelect
ForEver 
Client:

Code: Alles auswählen

EnableExplicit

Debug "client: initnetwork: "+InitNetwork()
Define verbindung=OpenNetworkConnection("localhost", 6500, #PB_Network_UDP)
Debug "client: opennetworkconnection: "+verbindung

Procedure a(verbindung)
  Protected event
  Repeat
    event=NetworkClientEvent(verbindung)
    Select  event
      Case  #PB_NetworkEvent_Data
        Debug "client: rohdaten empfangen"
      Case  #PB_NetworkEvent_Disconnect
        Debug "client: client getrennt"
      Case 0
        Delay(20)
    EndSelect
  ForEver
EndProcedure

If  verbindung<>0
  CreateThread(@a(), verbindung)
EndIf
OpenConsole()
Define input$, bytes
Repeat
  input$=Input()
  If  input$<>""
    bytes=SendNetworkData(verbindung, @input$, StringByteLength(input$))
    Debug Str(bytes)+" Bytes wurden gesendet."
  EndIf
ForEver 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: UDP - keine daten vorhanden

Beitrag von Moxl »

oh man :bounce:

das kommt davon wenn man spät abends sich noch an was versucht :lol:


vielen dank :allright:
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: UDP - keine daten vorhanden

Beitrag von Moxl »

jetzt hab ich mir ein programm geschrieben wo ein bild bzw mehrere bilder als stream via UDP gesendet werden.

das sind meine zwei proceduren womit ich sende und empfange:

Code: Alles auswählen

Procedure SendMemoryUDP(Verbindung, *MemoryBuffer, MemSize)
  *memorysize=AllocateMemory(4)
  PokeL(*memorysize, MemSize)
  result=SendNetworkData(Verbindung, *memorysize, 4)
  If  result=4
    result=SendNetworkData(Verbindung, *MemoryBuffer, MemSize)
  EndIf
EndProcedure

Code: Alles auswählen

Procedure ReceiveMemoryUDP(ClientID)
  *memorysize=AllocateMemory(4)
  ReceiveNetworkData(ClientID, *memorysize, 4)
  memorysize=PeekL(*memorysize)
  FreeMemory(*memorysize)
  If  memorysize<>0
    *memory=AllocateMemory(memorysize)
    errorcounter = 0 
    ReceivedBytes = 0
    Repeat
      result = ReceiveNetworkData(ClientID, *memory + ReceivedBytes, memorysize - ReceivedBytes)
      If result = -1
        Delay(1) 
        errorcounter + 1
      Else
        ReceivedBytes + result
        errorcounter = 0
      EndIf
    Until ReceivedBytes = memorysize Or errorcounter > 5000
    If  memorysize>0 And ReceivedBytes = memorysize
      ProcedureReturn *memory
    Else
      FreeMemory(*memory)
      ProcedureReturn 0
    EndIf
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
trotzdem kann kein image aus dem speicherpuffer *memory geladen werden... wo liegt das problem? :freak:
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: UDP - keine daten vorhanden

Beitrag von HeX0R »

Bei UDP werden die Pakete in kleine Häppchen verpackt (je nach MTU 1500 Bytes - 20 Bytes Header) und auf die Reise geschickt.
Es ist weder garantiert, dass diese Pakete ankommen, noch dass sie in der korrekten Reihenfolge bei deinem Server aufschlagen.

Bei Audio- oder Videostreams ist das nicht so schlimm, wenn das nicht 100% korrekt ankommt, wenn Du aber ein Bild verschickst, und das wieder anzeigen möchtest, muss zumindest der Bildheader und auch die Dateigröße korrekt sein, der eigentliche Bildinhalt darf ruhig verstrubbelt sein.
Das kannst Du aber ohne dass Du Dir eine Paketüberprüfung bastelst kaum bewerkstelligen.
Vermutlich wäre es für Dein Vorhaben besser auf TCP/IP umzuschwenken.

Mal davon abgesehen, erzeugst Du mit Deinen Prozeduren kleine Memory-Leaks.
Und für 4 Bytes reserviert man normalerweise keinen Speicher, sondern nimmt eine simple Variable.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

Re: UDP - keine daten vorhanden

Beitrag von Moxl »

ja in einem durchlauf schickt er ja nur ein bild. ich will mir aber einen stream bauen wo halt permanent bilder geschickt werden sodass ein video bei raus kommt :allright:

wie sieht denn so eine paketüberprüfung aus? :freak:
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: UDP - keine daten vorhanden

Beitrag von Thorium »

Moxl hat geschrieben:ja in einem durchlauf schickt er ja nur ein bild. ich will mir aber einen stream bauen wo halt permanent bilder geschickt werden sodass ein video bei raus kommt :allright:

wie sieht denn so eine paketüberprüfung aus? :freak:
Ein Videostream ist keine Folge von einzelnen Bilddateien.
Da wird erst der Header übertragen, der korrekt ankommen muss und danach die Frames, welche fehlerhaft ankommen dürfen. Die Frames sind auch nicht unbedingt komplett sondern können auch als Differenzinformation zum vorhergegangenen Frame übertragen werden. Simpel ist das ganze jedenfalls nicht und schon garnicht mit UDP. Probier dich erstmal an TCP und dann kannst probieren es auf UDP umzubauen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten