Seite 1 von 1
UDP - keine daten vorhanden
Verfasst: 22.02.2014 00:53
von Moxl
Halli Hallo
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

Re: UDP - keine daten vorhanden
Verfasst: 22.02.2014 01:19
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.
Re: UDP - keine daten vorhanden
Verfasst: 22.02.2014 01:36
von ts-soft
Das Len() bei SendNetworkData ist auch ungünstig, im Unicodemode kommt nur noch die Hälfte an
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
Re: UDP - keine daten vorhanden
Verfasst: 22.02.2014 11:31
von Moxl
oh man
das kommt davon wenn man spät abends sich noch an was versucht
vielen dank

Re: UDP - keine daten vorhanden
Verfasst: 23.02.2014 01:00
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?

Re: UDP - keine daten vorhanden
Verfasst: 23.02.2014 15:12
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.
Re: UDP - keine daten vorhanden
Verfasst: 23.02.2014 22:35
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
wie sieht denn so eine paketüberprüfung aus?

Re: UDP - keine daten vorhanden
Verfasst: 26.02.2014 21:06
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
wie sieht denn so eine paketüberprüfung aus?

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.