Portfreigabe für Client notwendig?

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

BtbN

BeitragSa, Apr 03, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Fast alle router haben Hole Punching an, da sollte kein Problem sein. Das Problem liegt eher in deinem Programm.

Hakkai

BeitragSo, Apr 04, 2010 8:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, aber wenn es am Programm lege würde es ja bei euch auch keine Nachricht empfangen ohne Portfreigabe. Hatte den kurzen Code doch testweise reingestellt.

Holzchopf

Meisterpacker

BeitragSo, Apr 04, 2010 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum dritten mal: Schicke die Nachricht nicht konstant an Port 9002, sondern an den Port, der dir UDPMsgPort zurückgibt. Du kannst nämlich nie wissen, ob dein Router aus dem Port 9002 vom LAN deines PCs ins WWW nicht plötzlich einen anderen Port macht. Router tun sowas.

Ich hoffe, du hast auch BtbNs Beitrag nicht überlesen.

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

Hakkai

BeitragSo, Apr 04, 2010 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich überlese keine Nachrichten, hab das schon getestet gehabt und hat alles nicht funktioniert...
hier das abgeänderte Beispiel mit

mystream = CreateUDPStream()
cport = UDPStreamPort(mystream)

Die Nachricht kommt bei mir nachwievor nicht an. Im Lan funktioniert das, im Internet hingegen nur mit Freigabe und festen Port.

Code: [AUSKLAPPEN]
; Graphical Variables
Global resolution_x = 200, resolution_y = 100, graph_depth = 32, graph_mode = 2

; Create Graphics
Graphics3D resolution_x, resolution_y, graph_depth, graph_mode
SetBuffer BackBuffer() ; DoubeBuffering

; Variable
;Const cport = 9002
Global cport

Const idsendmsg = 1

Local frametimer = CreateTimer(60) ; 60 FPS (Bilder pro Sekunde)
Global myip_dot$: network_getip(): DebugLog "Meine I-Net IP: " + myip_dot$
Global nachricht$
Global menu = 1
Global mystream
Global myip_int = network_intip(myip_dot$)

; Functions ////////////////////////////////////

Repeat ; Anfang der Hauptschleife
   
   AppTitle "Client test"
      
   Select menu
      Case 1: main() ; schreibe Nachricht in den Stream
      Case 2: network_read_data() ; lese aus dem Stream
   End Select
   
   WaitTimer(frametimer) ; wir wollen 60 FPS nicht mehr
   Flip(0)
   Cls
   If KeyHit(1) Then system_clean_up()
   
Forever

; Functions ////////////////////////////////////

Function main()

   mystream = CreateUDPStream()
   cport = UDPStreamPort(mystream)
   
   Local tmp_msg$ = "Client gestartet"
   nachricht$ = "Schicke mir selber eine Nachricht..."
   network_write_data( idsendmsg, "Client gestartet", myip_int, cport)
   DebugLog nachricht$
   
   menu = 2
   
End Function

; Functions ////////////////////////////////////

Function network_write_data( datatype, msg$, to_ip, to_port )
   
   Select datatype
      Case idsendmsg:
         WriteInt(mystream, idsendmsg)
         WriteString(mystream, msg$)
   End Select
   
   SendUDPMsg mystream, to_ip, to_port
   
End Function

; Functions ////////////////////////////////////

Function network_read_data()
   
   Local tmp_msg$ = ""
   Local tmp_ip = 0
   Local tmp_port = 0

   Local ip_rec_int = RecvUDPMsg(mystream) ; lese die Nachricht mit read, return ist senderIP
   Local rec_port = UDPMsgPort(mystream)
   
   If ip_rec_int
   
      nachricht$= "Neue Nachricht von Port: " + rec_port
      DebugLog nachricht$
      
      idc = ReadInt(mystream)

      If idc = idsendmsg Then ;erhalte: Nachricht
         tmp_msg$ = ReadString(mystream)   
                  
         nachricht= "Nachricht erhalten: " + tmp_msg
         DebugLog nachricht$
      EndIf
                  
   EndIf   
   
End Function

; Functions ////////////////////////////////////

Function network_intip(IP$)
  a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
  a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
  a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
  a4=Int(IP$)
  Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function

; Functions ////////////////////////////////////

Function system_clean_up()

   If mystream Then CloseUDPStream(mystream)
   End
   
End Function

; Functions ////////////////////////////////////

Function network_getip() ; lese wieistmeineip.de in myip ein

Local webserver$ = "www.meineipadresse.de"
Local webpath$ = "meine_ip.php"
Local tmp_msg$
Local tmp_sip_dot$
Local tmp_status$
Local tcp

;Verbinde zur Webseite

   tcp = OpenTCPStream( webserver$, 80 )
   
   If Not tcp
      Return 1 ;-> connection fehlgeschlagen
   EndIf
            
   ;Lese Meine Internet IP
   WriteLine tcp, "GET http://" + webserver$ + "/" + webpath$ + " HTTP/1.0"
   WriteLine tcp, ""

   If Eof( tcp )
      Return 1 ;-> connection fehlgeschlagen
   Else
                           
      While Not Eof(tcp) ;lese nun das Vz aus

         tmp_msg$ = ReadLine$(tcp)
         ;DebugLog(tmp_msg$)
         
         t = Instr(tmp_msg$, "<B>", 1)
         If t > 0
            s = Instr(tmp_msg$, ";", t)
            e = Instr(tmp_msg$, "<", s)
            tmp_ip_dot$=Mid( tmp_msg$, s + 1, e - s -1 )
            
            Exit         
         EndIf

      Wend
                        
   EndIf

   CloseTCPStream tcp

   myip_dot$ = tmp_ip_dot$

End Function

; Functions ////////////////////////////////////

Holzchopf

Meisterpacker

BeitragSo, Apr 04, 2010 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
UDPStreamPort?!

Der Server kennt den Port des Clienten erst, wenn er eine Nachricht von diesem erhält. Denn erst dann kann der Server den Port des Clienten mittels UDPMsgPort ermitteln.
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

Hakkai

BeitragSo, Apr 04, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig sehe, dann mach ich das doch in dem Beispiel von oben.

Holzchopf

Meisterpacker

BeitragSo, Apr 04, 2010 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig sehe, machst du mit Code: [AUSKLAPPEN]
Local rec_port = UDPMsgPort(mystream)
ausser Debuglogen nix.
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

Hakkai

BeitragSo, Apr 04, 2010 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber bei dem Teil:

Code: [AUSKLAPPEN]

Local ip_rec_int = RecvUDPMsg(mystream) ; lese die Nachricht mit read, return ist senderIP
Local rec_port = UDPMsgPort(mystream)
   
If ip_rec_int
   
   nachricht$= "Neue Nachricht von Port: " + rec_port
   DebugLog nachricht$
...


erhalte ich diese: "Neue Nachricht von Port ..." nur dann wenn ich den Port fest definiere und freigebe.
Das war ja alles was ich in dem Programm testen wollte.
Nehme mal an das das soweit stimmig ist und es bei mir hätte funktionieren sollen, ohne freigabe und feste Definition des Ports.

Holzchopf

Meisterpacker

BeitragSo, Apr 04, 2010 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab' eben aus Freude n kleines Beispiel geschrieben, wo gezeigt wird, wie der Server beim Empfang der ersten Nachricht die Daten des Clients bestimmt:

BlitzBasic: [AUSKLAPPEN]
Graphics 400, 300, 0, 2
SetBuffer BackBuffer()
Global TIMER = CreateTimer(30)

; IP und Port des Gegenübers
Global partnerIp, partnerPort

Type TMessage
Field txt$
Field col
End Type

Const STATE_SETUP = 0
Const STATE_JOIN = 1
Const STATE_GAME = 2
Global state = STATE_SETUP

Global Stream
Global inputText$, inputTextTemp$

; Hauptschleife
While Not KeyDown(1)
Select state
Case STATE_SETUP
Setup
Case STATE_JOIN
Join
Case STATE_GAME
Game
End Select

FlushKeys()
Flip 0
WaitTimer TIMER
Cls
Wend
End

Function Setup()
If KeyHit(2)
; Server erstellen
Stream = CreateUDPStream(9000) ; fixer Port
Message("Server erstellt", $AAAAAA)
state = STATE_GAME
ElseIf KeyHit(3)
state = STATE_JOIN
EndIf

Text 0,0, "1: Server"
Text 0,20, "2: Client"
End Function

Function Join()
If Input()
; lokalen Stream erstellen
Stream = CreateUDPStream() ; variabler Port
; Serververbindung aufbauen
partnerIp = StrToIntIP(inputText) ; IP und
partnerPort = 9000 ; Port des Servers sind bekannt
; Anmelden
WriteByte Stream, $00
SendUDPMsg Stream, partnerIp,partnerPort
Message("Verbindungsaufbau", $AAAAAA)
state = STATE_GAME
EndIf

Text 0,0, "IP des Servers eingeben:"
Text 0,20, inputTextTemp
End Function

Function Game()
Local ip = RecvUDPMsg(Stream)
If ip
Local msgType = ReadByte(Stream)
Select msgType
; Verbindungsanfrage
Case $00
; erst hier erfährt der Server IP und Port des Clienten
partnerIp = ip
partnerPort = UDPMsgPort(Stream)
WriteByte Stream, $01
SendUDPMsg Stream, partnerIp, partnerPort
Message("Client verbunden", $AAAAAA)
; Verbindungsaufbau
Case $01
Message("Verbindung aufgebaut", $AAAAAA)
; Nachricht
Case $10
Message(ReadString(Stream), $00FF00)
End Select
EndIf

If Input()
Message(inputText, $0080FF)
WriteByte(Stream,$10)
WriteString(Stream,inputText)
SendUDPMsg Stream, partnerIp, partnerPort
EndIf

DrawMessages

Color 255,255,255
Text 0, 260, "Nachricht:"
Text 0, 280, inputTextTemp
End Function

; leicht erweiterte Inputfunktion
Function Input()
Local char = GetKey()
If char = 8
If Len(inputTextTemp)>1
inputTextTemp = Left(inputTextTemp, Len(inputTextTemp)-1)
Else
inputTextTemp=""
EndIf
ElseIf char>31
inputTextTemp = inputTextTemp +Chr(char)
ElseIf char=13
inputText = inputTextTemp
inputTextTemp = ""
Return True
EndIf
End Function

Function Message(pMessage$, pColor)
Local msg.TMessage = New TMessage
msg\txt = pMessage
msg\col = pColor
End Function

Function DrawMessages()
Local y = 240
Local msg.TMessage = Last TMessage
Repeat
Color 0,0,msg\col
Text 0,y, msg\txt
If y < 0
Delete msg
EndIf
y = y -20
msg = Before msg
Until msg = Null
End Function

Function StrToIntIP(pIP$)
Local b1 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
Local b2 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
Local b3 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
Local b4 = Int(pIP$)
Return (b1 Shl 24) + (b2 Shl 16) + (b3 Shl 8 ) +b4
End Function


Kleiner geht's fast nicht. Netzwerk-Sachen sind eben immer aufwändige Sachen =/

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

Hakkai

BeitragSo, Apr 04, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weis zwar noch nicht warum aber ich werde es bald rausfinden, warum das Beispiel von dir bei mir läuft.
Danke.


Edit: =====
Ich muss mich korrigieren, ich war der Meinung es klappt, aber es funktioniert wie bei mir nur in eine Richtung. Der Server bekommt die Nachricht vom Client aber nicht andersrum. Wenn der Server versucht an den Client zu senden bekommt der Server die Nachricht 2 mal, einmal normal als lokale Nachricht und einmal auf seinen Port.

Das gleiche Phenomen habe ich mit meinem großen Programm, wo ich Server und Client getrennt starten kann.

2. Edit =====
Das Problem gibt es aber auch hier nur mit InternetIP's, bei Lan-Ips funktioniert alles wie es soll.

tft

BeitragMo, Apr 05, 2010 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Hakkai

BeitragMo, Apr 05, 2010 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich teste beides auf meinem Rechner, dabei bin ich hinter einem Router. Wollte es demnächst mit einem 2. Rechner versuchen, aber wenn du schon sagst der Server darf sich nicht hinterm Router befinden, kann ich mir das wohl spaaren.

Also ist das Internetgedöhns nur Möglich mit einem Server der nicht am Router hängt?

count-doku

BeitragMo, Apr 05, 2010 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir geht das auch wenn beide hinterm Router hängen.
Nur der Server muss einen Port freigeben.

Hakkai

BeitragMo, Apr 05, 2010 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@count-doku: kannst du mal bitte das Programm von Holzschopf ausprobieren, im Client deine InternetIP von http://www.wieistmeineip.de/ eintragen und schauen ob die Nachrichten die der Server schickt beim Client ankommen und andersrum.

Wenn das bei dir geht, dann muss es an meinem Router liegen.

count-doku

BeitragMo, Apr 05, 2010 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hakkai, hab ich gemacht und geht Smile
Ich hab auch selbst ein Chat programmiert, der läuft auch.

Hakkai

BeitragDi, Apr 06, 2010 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich habe den Fehler jetzt mit ziemlicher Sicherheit gefunden und zwar durch rumprobieren.

myport = 9000
to_port = 9000
mystream = CreateUDPStream(myport)
...
SendUDPMsg mystream, to_ip, to_port

solch eine Konstellation verärgert meinem Router scheinbar.
Er macht den Port für eine Weile dicht, wenn der selbe Port über und an sich selber eine Nachricht schickt.
Also wenn ich als Server oder Client mir über das Netz selber eine Nachricht zuschicken will.

Danke nochmal für das Beispiel Holzchopf, hat mir sehr geholfen den Fehler doch noch zu finden.
Nun muss ich erstmal warten bis meine ganzenz Ports wieder freigemacht werden Confused Confused

D2006

Administrator

BeitragDi, Apr 06, 2010 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du es lokal auf deinem Rechner testen willst, solltest du als IP "127.0.0.1" nehmen. Also falls du das meinst.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Hakkai

BeitragDi, Apr 06, 2010 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne, war nicht gemeint. Es ging um Internet und Ports, nicht um Lokal und IP's Wink

BtbN

BeitragDi, Apr 06, 2010 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal: Bis auf den Server-Port ALLE ports random und durch auslesen des Message-Ports bekommen. Server-Port fest. Nur ein Socket pro teilnehmer. Auch der Server nur einen. Sonst nix.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group