UDP - Vertex BnetEx Modul

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: UDP - Vertex BnetEx Modul

BeitragSa, Nov 18, 2017 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hi leute, ich habe mal eine nachfrage in bnet ex wird gezeigt das man so eine nachricht übermittelt

Code: [AUSKLAPPEN]
While Stream.SendMsg() ;Wend


meine nachfrage ist ab wann und wie muss der flush befehl genutzt werden?

Code: [AUSKLAPPEN]
Stream.Flush()


bei mir in meinem prog ist es so das server irgendwann einfach beendet, ohne eine fehlermeldung ect, daher geh ich davon aus das irgendwas im udp netzwerk verhalten unkorreckt ist. desweiteren denke ich dies weil ich den rest des progs ausgeklammert habe.

ich bitte daher um hilfe, den gesammten code zu senden wäre echt viel. ich verschlüssel nichts es geht alles über writeline zum server rüber falls dies noch eine wichtige info ist.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragSo, Nov 19, 2017 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Zunächst Mal ist UDP verbindungslos und stellt nicht sicher, dass Nachrichten in der gleichen Reihenfolge ankommen, wie die in der sie losgeschickt wurden, und stellt auch nicht sicher, dass Nachrichten ankommen. Das musst du bei deinem spezifischen Einsatzzweck bedenken.

Die Stream Objekte von BNetEx haben einen internen Nachrichtenpuffer, den du mit den WriteByte, WriteLine ... Funktionen füllen kannst (analog kannst du dann auf empfängerseite den Eingangs-Nachrichtenpuffer wieder auslesen mit ReadByte, ReadLine ...). Aber erst wenn du SendMsg aufrufst, werden diese Daten hinausgeschickt (in einem UDP Paket, und sendmsg garantiert nicht, dass es alle daten schickt, die im Puffer sind, daher brauchst du die While schleife).
Flush dient nur dazu den Empfangs- und Sendepuffer zu leeren. Das solltest du eigentlich nicht brauchen.

Edit: Es ist auch wichtig zu verstehen, dass ein "UDP Stream" in wirklichkeit nicht existiert. Das ist eine Abstraktion. Am Ende können die Nachrichten in unterschiedlicher Reihenfolge ankommen oder verloren gehen (siehe 1. Absatz).

Du kannst auch den Code von BNetEx und der Beispiele zu Rate ziehen: https://github.com/oliverskawronek/bnetex.mod

Wenn du konkretere Hilfe brauchst, wird ein Beispielcode, der nicht deinen Erwartungen entsprechend funktioniert, hilfreich sein.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragSo, Nov 19, 2017 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
ja diese infos habe ich schon, aber hier ich geb dir mal ein bsp

so funktionieren die codes und zwar fehlerfrei

Server:
Code: [AUSKLAPPEN]
SuperStrict

Framework brl.blitz
Import vertex.bnetex

Const LISTEN_PORT : Short = 1234

Global Stream : TUDPStream

' Please run udp_sender after
Try

Stream = New TUDPStream
If Not Stream.Init() Then Throw("Can't create socket")
Stream.SetLocalPort(LISTEN_PORT)

WriteStdout("UDP Receiver listining on port " + LISTEN_PORT + "~n")

Repeat
   If Stream.RecvAvail() Then
      While Stream.RecvMsg() ; Wend

      If Stream.Size() > 0 Then
         WriteStdout("Message from:~n" + ..
                     " - IP = " + TNetwork.StringIP(Stream.GetMsgIP()) + "~n" + ..
                     " - Port = " + Stream.GetMsgPort() + "~n")
   
         While Not Stream.Eof()
            WriteStdout(">" + Stream.ReadLine() + "~n")
         Wend
         stream.flush()
      EndIf
   EndIf
Forever

Catch Exception:Object
   WriteStdout("Error~n " + Exception.ToString())
End Try

If Stream Then Stream.Close()
WriteStdout("~n- ready -~n")
End


Client:
Code: [AUSKLAPPEN]
SuperStrict

Framework brl.blitz
Import vertex.bnetex

Const REMOTE_PORT : Short = 1234
Global Stream : TUDPStream

Try

Stream = New TUDPStream
If Not Stream.Init() Then Throw("Can't create socket")
Stream.SetRemoteIP(TNetwork.IntIP("127.0.0.1"))
Stream.SetLocalPort()
Stream.SetRemotePort(REMOTE_PORT)
Local A%
Repeat
        stream.WriteLine("Hello World! "+a)
        WriteStdout(stream.SendMsg() + " Bytes sended~n")
      stream.flush()
      a=A+1
        Delay 50
Forever
Catch Exception:Object
   WriteStdout("Error~n " + Exception.ToString())
End Try

If Stream Then Stream.Close()
WriteStdout("~n- ready -~n")
End



nehm ich das flush raus wird nichts gesendet und das programm läuft leer und windows beendet den task, es friert nicht ein oder so. sondern das programm killt sich einfach.

im eigentlichen bsp war der bef nicht vorhanden (flush)
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragSo, Nov 19, 2017 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, danke dafür. Das hat mir schon Mal geholfen.
Also ich denke ich habe mich geirrt. Du musst nach jedem SendMsg() Flush aufrufen, bzw. zwischen SendMsg und einem Write*-Zugriff auf den Stream.

So, die zwei Programme die du gepostet hast, funktionieren bei mir einwandfrei (Windows 8.1, BlitzMax 1.50, bnetex von github). Ich glaube, das Flush im Server könnte man weglassen, im Client ist es jedenfalls notwendig. Der Client crasht bei mir, wenn ich das Flush entferne.
Falls du eine ältere BlitzMax-Version oder nicht die bnetex von github hast, versuche vielleicht ein Update.

Kommt bei dir ein Fenster mit EXCEPTION_ACCESS_VIOLATION?
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragSo, Nov 19, 2017 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir crashen beide, server und client. (wobei server einiges besser verkraftet... aber crasht iwann dennoch)

also moment immer wenn ich gesendet habe, muss ich danach ein flush ausführen? immer wenn alles ankam ebenfalls?

Edit auf deine frage -> das mit dem fenster ja es kommt <- danach bin ich hingegngen und habe das ankommende auch mit einem flush überzogen aber dann waren die infos waage (die die ankamen - meist defekt)
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragSo, Nov 19, 2017 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehrlich gesagt wirkt es für mich so, als wäre da ein Bug entweder in BNetEx oder in den BRL Modulen.
Ich kann dir aber gerade nicht weiterhelfen.

Mit BlitzMax >=1.50 (habe jetzt auch die selbstkompilierte version von github probiert) und aktuellem BNetEx funktioniert es bei mir, wenn du im Client Flush() nach SendMsg() aufrufst.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragMo, Nov 20, 2017 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Problem ist das der Server irgendwann ein Access bekommt. Je nach Laufzeit. Und habe bis auf udp alles ausgeklammert. Daher weiß ich nicht genau wie ich das Problem angehen soll ich schreib einfach mal vertex an Falls er noch aktiv ist. Dennoch danke Thunder
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Jolinah

BeitragMo, Nov 20, 2017 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Flush leert gemäss Code den Sende- und Lese-Buffer.

Falls du viele Daten erhalten hast, aber nur Teile davon liest und verwendest, kannst bzw. solltest du den Buffer danach leeren. Leerst du den Buffer nicht, dann würde der nächste Aufruf von RecvMsg die empfangenen Daten an das Ende des Buffers hängen. Die nächsten Read-Befehle würden also erst noch die alten Daten zu Ende lesen, bevor die neuen dran kommen.

Beim Senden verhält es sich so ähnlich. Die Write-Befehle füllen den Sendebuffer und SendMsg versendet nach und nach alles was im Sendebuffer steht, bis es nichts mehr zu senden gibt. Ein Flush nach einem SendMsg stellt sicher, dass die nächsten Write-Befehle in einen frischen (leeren) Buffer schreiben.

Aufgrund der Natur der Lowlevel-Lese- und Schreib-Befehle ist nicht garantiert das alles aus dem Empfangsbuffer in den BMax-Lesebuffer übertragen wird oder alles aus dem BMax-Sendebuffer auf einmal gesendet wird. RecvMsg und SendMsg geben die Anzahl gelesener/geschriebener Bytes zurück. Daher die Schleife: So lange etwas gelesen/gesendet wurde, wird das ganze wiederholt, bis es nichts mehr zu lesen/senden gibt.

Bei deinem Beispiel hast du nur 1 SendMsg (ohne Loop). Bei kurzen Nachrichten sollte das in der Regel immer funktionieren. Aber wer weiss... falls nicht die ganze Nachricht gesendet wird und du kein Flush hast, dann würde evtl. folgendes passieren:

1. Er sendet z.B. "Hello". Der Sendebuffer enthält nur noch "World! 0~r~n".
2. Nächster Schleifendurchgang: Du fügst an das "World! 0~r~n" wieder ein "Hello World! 1~r~n" an. Der Sendebuffer enthält jetzt "World! 0~r~nHello World! 1~r~n".
3. Beim nächsten SendMsg() wird nun vielleicht "World! 0~r" gesendet, usw..

Und das in Kombination mit ReadLine() das ganze Zeilen lesen will, macht evtl. Probleme. Daher würde ich auch beim SendMsg eine Schleife machen. Oder Strings statt Zeilen senden und empfangen.

Thunder

BeitragDi, Nov 21, 2017 0:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Mathias, ich habe gute oder nicht so gute Neuigkeiten!

Habe drei Buffer Overflows in BNetEx gefunden. Habe vertex auf GitHub gerade darum gebeten, den Fix hinein zu pullen.
Solange er das noch nicht gemacht hat, kannst du dir die gefixte Version aus meinem Repo holen: https://github.com/chtisgit/bnetex.mod

bei mir läuft jetzt alles ohne Probleme auch ohne Flush()
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragDi, Nov 21, 2017 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
alter verwalter, ich bedanke mich in aller höflichster vorm bei dir, finde ich mega nett von dir Cool <3


EDIT: du hast wahrlich feinarbeit geleistet, es funktioniert wirklich ohne flush und bislang rennt es länger als 10 minuten ich bin so mega froh Very Happy


ihr glaubt gar nich wo ich den fehler überall gesucht hab bis ich an bnet selbst gedacht habe. und gespielt habe, zuvor habe ich mein nahezu gesamten quelltext immer wieder bearbeitet um fehler zu suchen die es eventuell nie gab.

und deswegen nochmal ein lob an dem forum, es ist so mega geil das es das gibt, und hoffe es wird nie eingestampft !!!! sonst wäre meine ganze zeit usw für die tonne gewesen... *HAPPY* LIKE THIS!
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragDi, Nov 21, 2017 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich betrachte BNetEx als sehr sehr hilfreiches Modul (danke an Vertex!), also ist war es für mich auch wert, die Zeit hineinzustecken.

was man zu dem Fall anmerken kann ist: BNetEx ist (laut Vertex' Github-Readme) schon 6 Jahre alt. Damals waren Betriebssysteme viel "fehlertoleranter" bei Buffer Overflows und dergleichen (was dann aber oft auch Sicherheitslücken mit sich zieht). Da hat sich bei allen viel getan und selbst off-by-one fehler (wenn man wirklich nur 1 byte über den Buffer hinaus schreibt) werden oft erkannt und als Fehler gemeldet (was leider bedeutet, dass das Programm einfach crasht).

Ich habe damals, als ich auf Windows 7 MaxNet geschrieben habe, überhaupt keine Probleme gehabt. Und wie ich es vor kurzem kompilieren wollte, ging es einfach nicht. Habe das auch mit einem eigenen Fehler abgetan... bis jetzt.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragDi, Nov 21, 2017 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ja die zeit. die verändert leider alles, somit auch das eben beschriebene, aber ich bin nun froh das mein server und eben auch client wieder läuft.

nun bald beginnt für mich so effekte die man im spiel einbinden kann. da überlg ich schon eine lange zeit wie man die am besten macht, ohne alles als ein bild anzeigen zu lassen. würd gern mit partikel arbeiten, aber habe da ebenso bedenken. naja dazu irgendwann vieleicht die eine oder andere frage, erst mal bin ich glücklich ^^
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

funkheld

BeitragDo, Feb 22, 2018 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, guten Tag.

Ich habe den Port geänder auf : 5410
Const REMOTE_PORT : Short = 5410

Bei der Ausgabe in der Console beim Server erscheint nicht mein Port:
5410
Es erscheint immer ein anderer Ports bei jeden Neustart.

Was muss ich in deinem Beispiel beim Server und beim Client von oben ändern damit nur meine Ports
benutzt werden bei beiden.
Ich habe auch deine neue Bnetex genommen.

Danke.
Gruss

Mathias-Kwiatkowski

BeitragDo, Feb 22, 2018 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Server sollte immer ein konstanten Port zugewiesen haben. der Client nicht der ändert sein Port. Der Server kann Antworten sobald der Client eine Anfrage sendet.

Der Server schaut nach der ip vom Client und nach dem Port und sendet dann zurück.

Wärend der Client immer die konstante ip und Port vom Server nutzt.

Bei tcp wäre es ein konstanter Stream worauf man immer Antworten kann wärend bei udp die ip und Port gesichert werden kann oder sollte.

Da udp Verbindungslos ist weisst du nicht wann die Verbindung nicht mehr aufrecht ist.oder ob deine Daten ankommen.

Ich habe ein mittlerweile großes mmo mit only udp gemacht. Und trotz 10 Spieler zur gleichen Zeit erstaunlich gute Resultate gehabt.

Das Spiel ist immernoch online. Aber nun bitte nicht vermuten das permanent alle Spieler online sind.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

funkheld

BeitragDo, Feb 22, 2018 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte das der Client einen konstanten Port hat.
Wie kann ich es bitte dort unten machen?
Es soll ein Test sein zu einem anderen Server..


Code: [AUSKLAPPEN]

SuperStrict
Import vertex.bnetex

Const REMOTE_PORT : Short = 5410
Global Stream : TUDPStream

Stream = New TUDPStream
Stream.Init()
Stream.SetRemoteIP(TNetwork.IntIP("127.0.0.1"))
Stream.SetLocalPort()
Stream.SetRemotePort(REMOTE_PORT)

Delay(1000)
stream.WriteLine("1"+Chr(10))
stream.SendMsg()
Delay 1000
stream.WriteLine("switch to 0."+Chr(10))
stream.SendMsg()
Delay 1000   
stream.WriteLine("stage."+Chr(10))
stream.SendMsg()
Delay 1000   

Repeat
   Delay(100)
   stream.WriteLine(Chr(10))
   stream.SendMsg()
Forever     

Stream.Close()


Danke.
Gruss

Mathias-Kwiatkowski

BeitragFr, Feb 23, 2018 2:25
Antworten mit Zitat
Benutzer-Profile anzeigen
was gedenkst du würde dieser befehl machen?

Code: [AUSKLAPPEN]
Stream.SetLocalPort()


aber der client sollte niemals ein festgelegten port haben!

egal, in diesem befehl steht nun also Stream = dein stream worauf du senden oder empfangen willst dann steht dort setlocalport

Setze Lokalen Port im übersetzten sinne, hättest du die dokumentation von vertex angefertigt dann würdest du die info erhalten.

Stream.SetLocalPort(Port:Short = 0)

0 bedeutet port wird automatisch bezogen so wie das system es kennt und eigentlich will (soweit ich es richtig verstanden habe, nun wenn du anstelle 0 nun 6543 eingibst gehe ich davon aus es wird genau dieser port bezogen, ob dieser port dann aber vom system frei gegeben ist weißt du nie.

jede software die update zieht ect nutzt auto ports also kann der port auf einem client immer blockiert (schon benutzt sein)

desweiteren macht dies kein sinn!
Code: [AUSKLAPPEN]
Repeat
   Delay(100)
   stream.WriteLine(Chr(10))
   stream.SendMsg()
Forever     

Stream.Close()

du schließt den stream aber zur welcher zeit da deine schleife nie verlassen wird.

du kannst niemals server und client den gleichen port vergeben (warum) so wie oben beschrieben wird dieser verwendet. und das 2. programm was auf dein pc rennt würde diesen port nicht beziehen können!

Code: [AUSKLAPPEN]
Stream.GetMsgIP()), Stream.GetMsgPort()


mit diesen befehlen bekommst du port und ip vom clienten raus du könntest also im server nun folgendes machen (wenn der client sein port selbst beziehen darf.

Code: [AUSKLAPPEN]

Stream.SetRemoteIP(TNetwork.IntIP(Stream.GetMsgIP()))
Stream.SetRemotePort(Stream.GetMsgPort())
Stream.WriteLine "was auch immer"
UDP.Stream.SendMsg()
delay 100


somit bekommt der server vom client der erstmals sich beim server melden muss die ip und den port herraus!
und darf dann auch darauf antworten, meines wissen kann der server sich auch nich einfach ohne anfrage beim clienten melden ohne vorher eine anfrage erhalten zu haben da dann jede firewall was dagegen hätte.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

funkheld

BeitragFr, Feb 23, 2018 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt für Blitzmax etwas gefunden.

Funktioniert wie "Tera Term" mit Eingabe usw.

http://forum.boolean.name/showthread.php?t=13400

Gruss

Mathias-Kwiatkowski

BeitragSa, Feb 24, 2018 2:18
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist kein UDP sondern TCP!
und du fragtest in eminem topic (UDP nach einer lösung ... nun bin ich verwirrt. auch die vertex bnet hat eine möglichkeit über TCP socket zu senden und empfangen. ich glaube du suchst so lange bis du dein programm durch würfel fertig gestrickt hast und wunderst dich dann das es fehler gibt. anstelle dein programm mit den gegebenheiten bis zu ende zu programmieren. den auch mit der bnet geht alles sehr wohl und gut.)


aber gut auch ich sagte dir letzendes wie du den port binden kannst. scheinbar war es nicht das was du wolltest... dabei kommt mir die frage ob du letzendes eine tcp oder udp verbindung haben willst.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

funkheld

BeitragSa, Feb 24, 2018 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe festgestellt das dieses UDP für mich nicht das Ergebnis erzielt.

Ich hatte gedacht das es TCP/UDP macht. Geht aber dort auch nicht so einfach.

Das die Möglichkeit besteht heisst wohl nicht das es so funktioniert.

Ich bin mit dem was ich gefunden habe sehr zufrieden und kann es jetzt für meine Verbindung umgeändert anwenden.

Gruss
 

funkheld

BeitragSo, März 11, 2018 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

vertex bnet hat eine möglichkeit über TCP socket zu senden und empfangen.


Dazu finde ich leider kein passendes funktionierendes Beispiel.

Danke.
Gruss

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group