BNetEx

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu Seite Zurück  1, 2, 3 ... 6, 7, 8 ... 11, 12, 13  Weiter

Neue Antwort erstellen

BtbN

BeitragFr, Jun 29, 2007 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du in einen Stream von BNetEx WriteByte/Int/Irgendwas/... machst, wird der kram den du schreibst intern in einem Buffer(Sprich ein Byte-Array, wenn man so will) gespeichert.
Ob es nun so sinnvoll ist, das erst in ein anderes ByteArray zu packen und dann zu kopieren, weiss ich nicht.

Vertex

BeitragSa, Jun 30, 2007 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier die Hierachie der Klassen:

Code: [AUSKLAPPEN]
              +----------+
              |    TIO   |
              +----------+
              | - Eof    |
              | - Size   |
              | - Seek   |
              | - Flush  |
              | - Close  |
              | - Read   |
              | - Write  |
              +----------+
                    ^
                    |
            +---------------+
            |    TStream    |
            +---------------+
            | - ReadBytes   |
            | - WriteBytes  |
            | - SkipBytes   |
            | - ReadByte    |
            | - WriteByte   |
            | - ReadShort   |
            | - WriteShort  |
            | - ReadInt     |
            | - WriteInt    |
            | - ReadLong    |
            | - WriteLong   |
            | - ReadFloat   |
            | - WriteFloat  |
            | - ReadDouble  |
            | - WriteDouble |
            | - ReadLine    |
            | - WriteLine   |
            | - ReadString  |
            | - WriteStrig  |
            +---------------+
                    ^
                    |
             +-------------+
             | TNetStream  |
             +-------------+
             | - Init      |
             | - RecvMsg   |
             | - SendMsg   |
             | - RecvAvil  |
             +-------------+
                    ^
                    |
          +---------+---------+
          |                   |
+------------------+ +--------------------+ +------------------+ +--------------+
|    TUDPStream    | |      TTCPStream    | |     TNetwork     | | TAdapterInfo |
+------------------+ +--------------------+ +------------------+ +--------------+
| - SetLocalPort   | | - SetLocalPort     | | - GetHostIP      | | - Device     |
| - GetLocalPort   | | - GetLocalPort     | | - GetHostIPs     | | - MAC        |
| - GetLocalIP     | | - GetLocalIP       | | - GetHostName    | | - Address    |
| - SetRemotePort  | | - SetRemotePort    | | - StringIP       | | - Broadcast  |
| - GetRemotePort  | | - GetRemotePort    | | - StringMAC      | | - Netmask    |
| - SetRemoteIP    | | - SetRemoteIP      | | - IntIP          | +--------------+
| - GetRemoteIP    | | - GetRemoteIP      | | - Ping           |
| - SetBroadcast   | | - SetTimeouts      | | - GetAdapterInfo |
| - GetBroadcast   | | - GetRecvTimeout   | +------------------+
| - GetMsgIP       | | - GetAcceptTimeout |
| - SetTimeouts    | | - Connect          |
| - GetRecvTimeout | | - Listen           |
| - GetSendTimeout | | - Accept           |
+------------------+ | - GetState         |
                     +--------------------+


TIO <- TStream <- TNetStream <- TUDPStream | TTCPStream

TIO hat die Methode Read:Int(Buffer:Byte Ptr, Size:Int) und da an man an die Pointer von Arrays ran kommt, kann man auch direkt und schnell ein Bytearray mit Bytes füllen lassen:
Code: [AUSKLAPPEN]
Size = MyByteArray.Length
If MyStream.Read(MyByteArray, Size) < Size Then Throw("Nicht alle Bytes konnten ausgelesen werden.")


mfg olli
vertex.dreamfall.at | GitHub
 

#Reaper

Newsposter

BeitragMo, Sep 10, 2007 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit2:

Ok, mit einer großen While-Schleife geht es nun auch, sorry fürs Fragen^^° Embarassed

(Mir fällt auch immer nur eine Lösung ein, wenn ich gerade nach Hilfe gefragt habe ^^ (oder eben mal auf der 1ten Seite eine Idee gefunden habe Wink))



-----------------------------


Edit:
Also habe nun eine "Lösung", bzw. das Problem gefunden.
ReadAvail() gibt mir zwar 0 zurück, weil ich wohl schon alles mit RecvMsg() eingelesen habe, aber im Buffer standen immernoch Bytes drinnen, welche nicht mehr von meinem Code beachtet wurden.
Mit
Code: [AUSKLAPPEN]
While Not Stream.Eof()
   Stream.ReadByte()
Wend

lies es sich "beheben", aber lässt sich das nicht evt. auch anders lösen?


----------------------------

Ich weiß nun nicht, ob ich etwas falsch gemacht habe, oder ob es ein Bug ist, deshalb poste ich nun dochmal hier.

Ich habe einen einfachen Server und Client geschrieben (UDP). Wenn nun der Client relativ "viel" zu dem Server sendet, kommt bei dem auf einmal nicht mehr alles "sofort" an. Also wenn ich nun z.B. einen Byte "10" hinsende, empfängt der Server das nicht, sondern erst dann, wenn ich nun erneut ein Byte (z.B. "12") sende. Aber dann muss ich wiederrum noch eins schicken, damit er die 12 empfängt usw... o_O
Ich kann mir nun überhaupt nicht erklären, warum das so ist O_o


Hier mal die Mainloop vom Server:

Code: [AUSKLAPPEN]
      Print Stream.RecvAvail()
      If Stream.RecvAvail() Then
         Local   FirstByte      :Byte      = 0         , ..
               SecondByte      :Byte      = 0
         
         
         While Stream.RecvMsg() ; Wend
         
         
         FirstByte = Stream.ReadByte()
         
         Print "Recv: "+FirstByte
         Select FirstByte
            [...]   
         End Select
      EndIf



Und hier der Client:
Code: [AUSKLAPPEN]

Import Vertex.BNetEx

Graphics 1024, 768



Global   Stream :TUDPStream = New TUDPStream

If Not Stream.Init() Then Throw("Can't create socket")
Stream.SetRemoteIP(TNetwork.IntIP("127.0.0.1")) '192.168.220.129
Stream.SetLocalPort()
Stream.SetRemotePort(5143)


Global Keys:Byte[256]

While Not AppTerminate()
   z = 0
   For i=0 To 255
      If KeyDown(i) Then
         If Keys[i] = 0 Then
            WriteByte Stream, 205
            WriteByte Stream, i
            While Stream.SendMsg() ; Wend
            
            Keys[i] = 1
            Print "Down: "+i
         EndIf
      Else
         If Keys[i]=1 Then
            WriteByte Stream, 206
            WriteByte Stream, i
            While Stream.SendMsg() ; Wend
            
            Keys[i] = 0
            Print "Up: "+i
         EndIf
         Keys[i] = 0
      EndIf
      
      If Keys[i]=1 Then
         z :+ 1
         DrawText "Key: "+i, 10, z*12+5
      EndIf
   Next
   Delay 10
   
   Flip
   Cls
Wend



Also entweder liegt es am Client, oder am Server :-/
Habe auch schonmal extra mehrmals SendMsg() ausgeführt, aber ohne Erfolg.

Habe das ganze sowohl mit v1.66 und 1.70beta2 getestet.


Wäre dankbar für Rat Wink


MfG
#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Apprauuuu

BeitragSo, Okt 14, 2007 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird die Libary überhaupt noch erweitert??
Z.B. mit sicherem UDP??
Das wäre echt super Very Happy
Bin nämlich grad uf der Suche nach einer peer-to-peer reliable UDP lib aber hab nichts aktuelles gefunden, da sie entweder nicht p2p sind oder nicht komplett gewrappt -.- (z.b. raknet)
Arbeitsstand:
Umprogrammierung von LOL³Warriors und LOL³Fighters in Bmax...
LOL³Fighters wird spielerisch noch mal ordentlich aufpoliert, um es Ligatauglich zu machen (zumindest für private Funligen von mir ^^)
 

Dreamora

BeitragSo, Okt 14, 2007 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Vertex hat irgendwo in diesem Thread mal geschrieben, das BNetEx als Netzwerk Layer ausgelegt ist, nicht als Netzwerk Library. Die Library Funktionen wie reliable UDP (was relativ simpel zu implementieren ist mit ACK - NACK ) sei Sache des Users.

Finde ich auch gut so, denn die Netzwerk Programmierung verlangt eh, dass der User ein wenig eine Ahnung davon hat und da ist reliable UDP noch der simpelst zu verstehende Aspekt mit dem "OK" (ACK) und "Nicht OK" (NACK) Prinzip ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Vertex

BeitragSo, Okt 14, 2007 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
#Reaper:
Auch wenns etwas spät kommt, das liegt vermutlich am OS. Die Daten werden irgendwo gepuffert, bis ein gewisse Größe überschritten wird oder ein Timeout abgelaufen ist. Einfach um den Overhead gering zu halten. Weiß das aber auch nicht genau, schließlich habe ich dazu kaum Info Material.

Apprauuuu:
Wie Dreamora schon sagte. Joar, die Weiterarbeit stelle ich mal in Frage. IMurDoom hat vllt. noch ein "Fehler" unter MacOS entdeckt - bedingt durch untersch. Endians. $AABBCCDD von MacOS gesendet käme dann vermutlich beim Intel Windows als $DDCCBBAA an. Und der Puffer der Netzstreams könnte noch effizienter verwaltet werden(siehe mein Essay zu schnellen Arrays/Listen). Ich wüsste jetzt aber auf Anhieb nicht, was BNetEx noch unter dem Aspekt LowLevel an Features bräuchte. Dieses Ex(tendet) in BNetEx ist sicher damit auch sehr weit hergeholt.

Man könnte sicher noch als Zusatzmodul eine HighLevel Engine anführen mit Acknowleges, PlayerIDs usw. aber dazu fehlt mir momentan eh die Zeit. GGf. wären noch Helper Funktionen wie CRC32, MD5, Huffman usw. ganz sinnvoll.

mfg olli
vertex.dreamfall.at | GitHub
 

#Reaper

Newsposter

BeitragMo, Okt 15, 2007 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vertex:
Oh, hat sich schon (lange) erledigt Wink
War ein Fehler von mir Embarassed
Hatte zwar mit
Code: [AUSKLAPPEN]
While Stream.RecvMsg() ; Wend

Alles in den Stream geladen (Vorsicht! Ich drücke mich hier eh sicherlich etwas falsch aus^^), aber nicht mehr alles mit ReadByte() o.ä. aus dem Stream ausgelesen. Durch RecvMsg() war dann aber RecvAvail() (ich will immer ReadAvail benutzen Mad ) Null. Durch einen etwas anderen Aufbau der Schleife funktioniert es dann einwandfrei Wink

Bsp:
Code: [AUSKLAPPEN]
If Stream.RecvAvail() Then            'Abfragen ob etwas vorhanden ist.
   While Stream.RecvMsg() ; Wend      'Auslesen der Daten in den Stream (Ausdrucksweise...)
   
   While Not Stream.Eof()             'Alles solange abarbeiten, bis nichts mehr im Stream vorhanden ist
      FirstByte = Stream.ReadByte()   'Auslesen/benutzen der Daten im Stream (dadurch wird der Stream erst "leerer")
      
      Select FirstByte
         [...]
      End Select
   Wend
EndIf


Damit das keinem anderem newbie mehr passiert Wink


MfG
#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Mathias-Kwiatkowski

BeitragMi, Dez 05, 2007 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe die frage auch nochmal hier gestellt weil es sich ja um das mod bnetex handelt, ich weiss nicht mehr weiter ich möchte das der client eine mitteilung zum server bringt und wenn die mitteilung angekommen ist das eine mitteilung vom server am clienten geht, nur ich bekomme es irgendwie nicht hin und ich weiss nicht woran es liegt, das sind meine codes, vll ist da ja irgendwo ein fehler , es wäre hilfreich wenn es ein beispiel dazu geben würde. das ist eigentlich das einzige was ich wissen muss um mein spiel fertig zu proggen. und ich würde mich über hilfe sehr freuen. Danke im vorraus

ja das habe ich bereits versucht,
hier das server modell

Code: [AUSKLAPPEN]

Framework Vertex.BNetEx

Global Stream : TUDPStream

'Try

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

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

      If Stream.Size() > 0 Then
'         ip = TNetwork.StringIP(Stream.GetMsgIP())
         
   
         While Not Stream.Eof()
            StreamIncomming:String = Stream.ReadLine()
            WriteStdout StreamIncomming
            If streamincomming = "Hello World!" Then
               Stream.SetRemoteIP(TNetwork.IntIP(TNetwork.StringIP(Stream.GetMsgIP())))
               Stream.WriteLine("Hello World1!")
               WriteStdout(Stream.SendMsg() + " Bytes sended~n")
               
            EndIf
         Wend

      EndIf
   EndIf
Forever



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


und hier das client modell

Code: [AUSKLAPPEN]
SuperStrict

Framework Vertex.BNetEx

Global Stream : TUDPStream



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(6000)

Stream.WriteLine("Hello World!")
WriteStdout(Stream.SendMsg() + " Bytes sended~n")



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

      If Stream.Size() > 0 Then
'         ip = TNetwork.StringIP(Stream.GetMsgIP())
         

             While Not Stream.Eof()
            WriteStdout Stream.ReadLine()
            
         Wend


      EndIf
   EndIf
Forever




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


er soll wenn client Hello World! gesendet hat zurück am clienten Hello World1! senden, allerdings sendet er es direct an sich selber, sprich der server am server. und das wollt ich eigentlich nicht

damit der server es am clienten sendet habe ich volgendes eingebaut:

(am server eingebaut)
Code: [AUSKLAPPEN]
Stream.SetRemoteIP(TNetwork.IntIP(TNetwork.StringIP(Stream.GetMsgIP())))
               Stream.WriteLine("Hello World1!")
               WriteStdout(Stream.SendMsg() + " Bytes sended~n")
 

Mr Hopp

BeitragMi, Dez 05, 2007 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
1. wäre folgendes viel leichter:

Code: [AUSKLAPPEN]
Stream.SetRemoteIP TNetwork.IntIP(Stream.GetMsgIP())


Und 2. musst du dich auchnoch um den Port kümmern. Habe die Codes jedoch nicht durchgelesen, sondern nur letzteres
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.

Mathias-Kwiatkowski

BeitragMi, Dez 05, 2007 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist doch das prob Stream.SetRemoteIP TNetwork.IntIP(Stream.GetMsgIP()) funktioniert doch nicht
 

Dreamora

BeitragMi, Dez 05, 2007 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch tut es sonst würdest du nix bekommen.
Wie Mr Hopp sagte: du musst die Ports mit einbeziehen, denn der Client und der Server sind hinter verschiedenen Ports. Solange du das nicht tust, wird er es immer sich selbst schicken.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Vertex

BeitragDo, Dez 06, 2007 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Merke dir, dass TCP und UDP Ports nur einmal pro Netzwerkadapter vergeben werden dürfen!

Du hast folgendes gemacht:
- Server Local Port = 6000
- Server Remote Port = 6000
- Client Local Port = XYZ
- Client Remote Port = 6000

Das solltest du aber machen:
- Server Local Port = 6000
- Server Remote Port = Server.GetMsgPort() ' und das pro Nachricht
- Client Local Port = XYZ
- Client Remote Port = 6000

Bei deiner Konstellation hat der Client an Port 6000 "Hello World!" geschickt, und der Server das ganze empfangen. Nun schickt der Server die Nachricht "Hello World!" an Port 6000 - also an sich selber. Der Server empfängt die Nachricht erneut und sendet sie sich auch erneut wieder. Das ganze ist dann eine Endlosschleife ^^

Der Client Socket wird NACH Start des Servers auch nie den lokalen Port 6000 zugewiesen bekommen.

mfg olli

Edit: Achja, mal noch wegen IntIP usw.:
- TUDPStream.GetMsgIP() gibt Int zurück
- TNetwork.IntIP(StringIP) gibt Int zurück
- TNetwork.StringIP(IntIP) gibt String zurück

Server.SetRemoteIP(Server.GetMsgIP()) ist also legitim. Und ich würde nebenbei mal SuperStrict einschalten, sonst schleichen sich noch unnötige Fehler ein.
vertex.dreamfall.at | GitHub

Mathias-Kwiatkowski

BeitragSa, Dez 08, 2007 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
jop habs kapiert ich habe mein programm nochmal in BB3D geproggt und dort ist es mir mit den blödsinnigen ports aufgefallen, tutu mir leid wegen der aufdringlichkeit, sorry
 

#Reaper

Newsposter

BeitragFr, Jan 04, 2008 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal eine (blöde) Frage:
Wie sieht das eigentlich mit UDP und Packets aus? In B3D konnte ja noch einzelne Pa[c]kete (ja, eigentlich ohne C...) versenden, wenn ich mich nicht irre, oder?
Wie sieht das nun mit BMax/BNetEx aus? Oder ist es da möglich, ohne Unterbrechung etwas zu versenden (also z.B. ein beliebig großen String o.ä.)?
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

Dreamora

BeitragSa, Jan 05, 2008 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch hier sind es einzelne packete. Du schreibst in den Stream und sobald du sendest gibt das ein packet von allem geschriebenen seit dem letzten senden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

#Reaper

Newsposter

BeitragSa, Jan 05, 2008 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, sendet der Befehl stream.SendMsg() denn alles sofort? Weil den muss (?) man ja immer solange ausführen, bis False zurückgegeben wird.
(Btw: Das es im enteffekt eh immer (eins oder mehrere) Pakete sind, ist mir schon klar. Nicht, dass ihr mich falsch versteht.)
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Vertex

BeitragMo, Jan 07, 2008 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Jeder Aufruf der Methode SendMsg hat ein Paket zufolge, egal ob TCP oder UDP. Ob das Betriebssystem mehrere kleinere Pakete erst zusammenfasst, weiß ich nicht.
vertex.dreamfall.at | GitHub

BtbN

BeitragMo, Jan 07, 2008 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit ich weiss, hängt es von der Option TCP No Delay ab. Ist diese aktiviert, wird jedes paket sofort gesendet.
Wenn nicht, werden pakete die in einem kurzen zeitraum nacheinandern gesendet würden, zu einem zusammengefasst.

Mathias-Kwiatkowski

BeitragMi, März 19, 2008 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
noch mal eine frage kann man feststellen ob ein UDP client einfach den server verlassen hat oder geht das nicht?

Hummelpups

BeitragMi, März 19, 2008 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
geht nicht
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Gehe zu Seite Zurück  1, 2, 3 ... 6, 7, 8 ... 11, 12, 13  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group