Problem mit Client zu Server UDP

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jamagin

Betreff: Problem mit Client zu Server UDP

BeitragMi, Nov 18, 2009 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, es sind schon viele UDP's Fragen hier im Forum, doch ich habe keine Antwort auf mein Problem gefunden. Ist sicher nur ein kleines Problem.
Ich habe mir das UDP Chat von blitzbasic.com runtergeladen und soweit verändert, daß ich nicht chatten kann, sondern das sich 2 Kreise mit der Maus steuern lassen.

Wenn ich am Host PC die Maus bewege, wird die Bewegung auch an den Client geschickt, bewege ich die Maus am Client wird diese aber nicht am Host angezeigt. Woran kann das liegen?

Ich poste mal den Code, vielleicht hab ich ja nur was übersehen, aber ich schnalls echt nicht! Embarassed

Code: [AUSKLAPPEN]

; UPD Test
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

AppTitle("Basic UDP Example")
Global Status$
Global PortIn = 25000
Global PortOut = 25001
Global RecMsg$
Global SndMsg$
Global PType%
Global Client%
Global Server%
Global Join_IP$
Global Send_IP%
Global Serv_IP%
Global Temp%


Global x1, y1, x2, y2, x1alt, y1alt

Choice$ = Input("Would you like to host a chat server or join one? [h or j]")

If Choice = "h" Or Choice = "H" Then
   Server = CreateUDPStream(PortIn) ;Server listens on 25000
   If Server <> 0 Then
      Status = "Server started..."
   Else
      Status = "Error starting server."
   EndIf
   PType = 1 ;Is Player a host?
Else
   Join_IP$ = Input("Enter the ip address of host: [192.168.0.1]")
   If Len(Join_IP) = 0 Then Join_IP = "192.168.0.1"
   Serv_IP = IntegerIP(Join_IP) ;need to change entered ip address to ip format so blitz can read
   Client = CreateUDPStream(PortIn) ;Client Listens on 25000
   If Client <> 0 Then
      Status = "Client connected to "+Serv_IP
   Else
      Status = "Error starting client."
   EndIf
   PType = 2 ;Is Player a Client?
EndIf

Repeat
   Cls
   Check_Keys()
   
   If PType = 1 Then Temp% = RecvUDPMsg(Server)
   If PType = 2 Then Temp% = RecvUDPMsg(Client)
   If Temp <> 0 Then DebugLog Temp
   If Temp <> 0 Then
      If PType = 1
         Send_IP = UDPMsgIP(Server) ;Get IP Address of Message Sender
         x1 = ReadShort (Server)
         y1 = ReadShort (Server)
      Else
         Send_IP = UDPMsgIP(Client) ;Get IP Address of Message Sender
         x2 = ReadShort (Client)
         y2 = ReadShort (Client)
      EndIf      
   EndIf
   
   ; Remote Kreis
   If PType = 1
      Color 255, 0, 0
   Else
      Color 0, 255, 255
   EndIf
   Oval x2, y2, 30, 30, 1

   ; lokaler Kreis
   x1 = MouseX()
   y1 = MouseY()
   If PType = 1
      Color 0, 255, 0
   Else
      Color 255, 0, 255
   EndIf
   Oval x1, y1, 30, 30, 1

   Text 10,20,"Status: "+Status
   Text 10, 400, "Server   "+"X1= "+X1+"   Y1= "+Y1
   Text 10, 420, "Client   "+"X2= "+X2+"   Y2= "+Y2
   Flip
Until KeyHit(1)
End

Function Check_Keys()
      ; mauszeiger und objekte
      If PType = 1 And Send_IP <> 0                ;Player is a host, send message to client
         WriteShort (Server, x1)
         WriteShort (Server, y1)
         SendUDPMsg(Server, Send_IP, PortIn)
      EndIf
      
      If PType = 2 And Serv_IP <> 0                                    ;Player is a client, send message to server
         WriteShort (Client, x1)
         WriteShort (Client, y1)
         SendUDPMsg(Client, Serv_IP, PortIn)
      EndIf
End Function

Function IntegerIP(IP$)
   ;From Blitzbasic Forums 'Chroma'
   ;IP address must be converted to an integer
   off1=Instr(ip$,".")     :ip1=Left$(ip$,off1-1)
   off2=Instr(ip$,".",off1+1):ip2=Mid$(ip$,off1+1,off2-off1-1)
   off3=Instr(ip$,".",off2+1):ip3=Mid$(ip$,off2+1,off3-off2-1)
   off4=Instr(ip$," ",off3+1):ip4=Mid$(ip$,off3+1,off4-off3-1)
   Return ip1 Shl 24 + ip2 Shl 16 + ip3 Shl 8 + ip4
End Function


Würde mich echt freuen, wenn wer den Fehler findet?

Danke


Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

Meik

BeitragMi, Nov 18, 2009 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir deinen Code jetzt nicht genau angeschaut. Aber geb mal, wenn du als Client startest, nicht 192.168.0.1 ein sondern 127.0.0.1. Hab's nicht getestet aber vielleicht hilfts Smile

Edit: Ok getestet, bringt nichts ^^. Wenn ich heute noch genug Zeit finde schau ich es mir.

Jamagin

Betreff: UDP

BeitragMi, Nov 18, 2009 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Meik,

an der Adresse liegt es nicht, weil diese ist im Beispiel drin. Da muß man seine eigene IP eingeben, wenn man 2 PC hat immer die vom HOST. Kann man mit ipconfig unter der konsole rausfinden! (Ausführen --> CMD -->ipconfig)

Es geht mir nur darum, wenn ich als Client die Maus bewege, sollte die Bewegung auch am Server sichtbar sein, weil die Variablen ja die gleichen sind! (x2, y2)

Jamagin
Bevor du etwas neues beginnst, erledige das alte

NightPhoenix

BeitragMi, Nov 18, 2009 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne viel von UDP zu verstehen, aber die BB-Hilfe angeschaut zu haben:
Zum senden und empfangen benötigst du 2 verschiedene Ports. Nur der eine Port in deinem Code tut's wahrwscheinlich nicht. Das geht bei TCP, aber anscheinend bei UDP nicht.

Code: [AUSKLAPPEN]
udp_read=CREATEUDPSTREAM(In_Port)
udp_write=CREATEUDPSTREAM(Out_Port)


Ist bei dir so nicht der Fall. Du benutzt 2 mal die Variable "PortIn" für beide UDPs

Holzchopf

Meisterpacker

BeitragMi, Nov 18, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
:O *einschreit* um Himmelswillen, nein! *haarerauf*
Zwei Streams zu benutzen ist - ich sag's jetzt einfach mal so - Schwachsinn, weil dann beide Seiten, also Server und Client, an der Firewall und Router Ports freischalten müssen.

Dein Problem ist ganz einfach (verzwickte Sache):
Du versuchst beide Programme (Server und Client) auf Port 25000 horchen zu lassen. Aber das geht gar nicht (eigentlich solltest du gar nicht in der Lage sein, beide gleichzeitig ausführen zu können), weil jeder Port immer nur von einem Stream (und folglich auch nur von einem Programm) belegt sein kann.
Am einfachsten ist es, wenn nur der Server einen fixen Port hat (eben zB 25000) und der Client einen beliebigen Port selber wählen kann. Der Client schickt dann die erste Nachricht an den Server und dieser ermittelt einfach mit UdpMsgPort wohin er zurücksenden muss.

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

BIG BUG

BeitragMi, Nov 18, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Jopp, einfach aus
Code: [AUSKLAPPEN]
 Client = CreateUDPStream(PortIn) ;Client Listens on 25000

das hier machen
Code: [AUSKLAPPEN]
 Client = CreateUDPStream() ;Client port specified by system
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Silver_Knee

BeitragMi, Nov 18, 2009 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den 2 Streams wurde einst von Rob in seinem Tut geschrieben und ohne große Erklärung von allen ange- und übernommen.

Das einzige was passieren kann ist dass man zur gleichen Zeit Sachen schreibt und liest und das geht laut Rob nicht. Macht man aber normalerweise nie. Wenn man immer erst nach seiner RecvNetMsg Schleife Sendet ist eh nix mehr im stream, was irgendwie irgendwo weggeschickt werden könnte.

Jamagin

Betreff: Problem mit Client zu Server UDP

BeitragSo, Nov 29, 2009 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Thread kann geschlossen werden! Mit Portweiterleitung funktioniert es einwandfrei!

Danke für Eure zahlreichen Tips!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group