Probleme mit UDP [BNetEx]?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

bruce85

Betreff: Probleme mit UDP [BNetEx]?

BeitragMo, März 26, 2012 4:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,
ich habe versucht mein Online Spiel von TCP zu UDP umzuschreiben, leider ist der Stream vom Client immer leer.
Wenn ich vom Client zum Server etwas schicke, dann funktioniert es, nur wenn der Server es dann weiter zum Client schicken soll, dann funktioniert es nicht.
Ich habe auch hier im Forum sehr viel nach beispielen gesucht und auch welche gefunden, nur weiss ich nicht, ob das mit der Clientliste auch so funktioniert wie bei TCP.

Ich sitze eigentlich schon ein Paar tage an diesem Problem und habe es dann auch erst aufgegeben und jetzt wieder mal versuch, leider ohne erfolg.

Hier ist mal ein teil von meinem Code:
BlitzMax: [AUSKLAPPEN]
	If isServer = 1 Then
If Server.RecvAvail() Then
While Server.RecvMsg() ; Wend

If Server.Size() > 0 Then
Local z:Int = Server.ReadByte()
Select z
Case 1
Print("Message from:")
Print(" - IP = " + TNetwork.StringIP(Server.GetMsgIP()))
Print(" - Port = " + Server.GetMsgPort())
Clients.AddLast(Server)
Case 3
Local l:Byte = Server.ReadByte()
Local n:String = Server.ReadString(l)
l = Server.ReadByte()
Local t:String = Server.ReadString(l)
Local M:TMessage = New TMessage
M.Name = n
M.Text = t
For Client = EachIn Clients
Client.WriteByte(3)
Client.WriteByte(Len(Spielername))
Client.WriteString(Spielername)
Client.WriteByte(Len(MessageText))
Client.WriteString(MessageText)
Client.SendMsg()
Next
End Select
EndIf
EndIf
Else
If Client.RecvAvail() Then
While Client.RecvMsg() ; Wend

Local z:Int = Client.ReadByte()
Select z
Case 3
Local l:Byte = Client.ReadByte()
Local n:String = Client.ReadString(l)
l = Client.ReadByte()
Local t:String = Client.ReadString(l)
Local M:TMessage = New TMessage
M.Name = n
M.Text = t
End Select
EndIf
EndIf


Der Server schickt einfach nicht die Daten zum Clienten, das was der Server empfangen hat.
Woran könnte das Problem denn liegen?

Ich bedanke mich schonmal im Voraus.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
  • Zuletzt bearbeitet von bruce85 am Mo, März 26, 2012 18:02, insgesamt einmal bearbeitet

ZEVS

BeitragMo, März 26, 2012 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Clients.AddLast(Server)

klingt nicht gut. Server und Clients sollte man auseinanderhalten. Alternativ wäre es schön zu wissen, was diese Variable soll.
Zitat:
Der Server schickt einfach nicht die Daten zum Clienten, das was der Server empfangen hat.

Grammatik ist eine tolle Sache, auch wenn das Problem besteht, dass man verstanden wird.
Bist du dir sicher, dass der Server Daten schickt? GGf. stimmt irgendetwas mit der Initialisierung nicht. Wenn ich mich recht entsinne, gibt TUDPStream.SendMsg False zurück, wenn etwas nicht klappte. Dies solltest du auf jeden Fall überprüfen.

ZEVS
P.S: Du solltest irgendwo erwähnen, dass du BNetEx verwendest. Am besten im Titel.
 

bruce85

BeitragMo, März 26, 2012 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
TUDPStream.SendMsg ist immer auf false, auch wenn ich versuche zu den Clienten etwas zu schicken.
Wenn Clienten etwas zum Server schicken, dann funktioniert das ja auch, nur kann der Server die Daten dann nicht weiter zu den Clienten schicken, da TUDPStream.SendMsg bei den Clienten immer auf false ist.
Also, bei den Clienten kommen die Datenpakete einfach nicht an.

Woran könnte das denn liegen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

ZEVS

BeitragMo, März 26, 2012 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wahrscheinlich fehlt SetRemoteIP/SetRemotePort. Ansonsten stimmt die Konfiguration nicht oder es liegt ein tieferer Fehler zugrunde.

ZEVS
 

bruce85

BeitragMo, März 26, 2012 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.
Hier ist mal der Code um ein Server zu erstellen oder beizutreten:
BlitzMax: [AUSKLAPPEN]
	If ButtonClick(button002_png,GraphicsWidth()/2-ImageWidth(button002_png)/2,300,0,190,190,190,150,150,150,"Spiel erstellen",0,0,Schrift3,200,200,200,1) Then
Server = New TUDPStream
If Not Server.Init() Then Throw("Can't create socket")
If Not Server.SetLocalPort(8010) Then Throw("Can't set local port")

Clients = New TList
isServer = 1
MultiplayerSpielMenu()
EndIf
If ButtonClick(button002_png,GraphicsWidth()/2-ImageWidth(button002_png)/2,340,0,190,190,190,150,150,150,"Spiel beitreten",0,0,Schrift3,200,200,200,2) Then
Client = New TUDPStream
If Not Client.Init() Then Throw("Can't create socket")
Client.SetRemoteIP(TNetwork.intIP("127.0.0.1"))
Client.SetRemotePort(8010)
Client.WriteByte(1)
Client.SendMsg()

isServer = 0
MultiplayerSpielMenu()
EndIf


und hier sende ich dann z.B. die Nachricht, was der benutzer eingegeben hat:
BlitzMax: [AUSKLAPPEN]
If KeyHit(KEY_RETURN) And KeyDown(KEY_RETURN)
If Len(MessageText) > 0 Then
If isServer = 1 Then
Local M:TMessage = New TMessage
M.Name = Spielername
M.Text = MessageText
For Client = EachIn Clients
Client.WriteByte(3)
Client.WriteByte(Len(Spielername))
Client.WriteString(Spielername)
Client.WriteByte(Len(MessageText))
Client.WriteString(MessageText)
Client.SendMsg()
Next
MessageText = ""
Else
Client.WriteByte(3)
Client.WriteByte(Len(Spielername))
Client.WriteString(Spielername)
Client.WriteByte(Len(MessageText))
Client.WriteString(MessageText)
Client.SendMsg()
MessageText = ""
EndIf
EndIf
EndIf


um die Datenpakete dann abzufragen, hab ich schon in meinem ersten Post gepostet.

Der Server schickt es einfach nicht zu den Clienten, wenn ich als Server etwas zu den Clienten schicken möchte.

Habe ich Vielleicht was falsch gemacht?

Danke schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

ZEVS

BeitragMo, März 26, 2012 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Da UDP ein verbindungsloses Protokoll ist, kann der Server leider nicht erahnen, wohin die Nachricht gehen soll. Du musst also vor dem Senden jeder Nachricht den Port und die IP des Clients einstellen. Diese kannst du beim Login des Clients vermittels GetMsgPort/GetMsgIP ermitteln.

ZEVS
 

bruce85

BeitragMo, März 26, 2012 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
Das habe ich ja auch schon versucht, leider funktioniert es nicht.
Irgendwas mache ich falsch... Rolling Eyes

Edit: Ich habe das jetzt doch hinbekommen, ich habe statt RemotePort... LocalPort gesetzt gehabt, deswegen ging das nicht.

Ich danke Dir vielmals für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group