[TCP] Basic TCP Chat - Funzt nicht [ERLEDIGT]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: [TCP] Basic TCP Chat - Funzt nicht [ERLEDIGT]

BeitragFr, Aug 07, 2009 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Ich habe eben versucht den 'Basic TCP Chat' über's Internet und über's LAN zu testen.
Leider hat beides nicht funktioniert.
Ich habe 100%ig die richtigen IP-Adressen verwendet.
Port-Forwarding ausgeführt.

Hier der Code: [AUSKLAPPEN]
Graphics3D 500,400,16,2
SetBuffer BackBuffer()

AppTitle("Basic TCP Example")

Global Status$
Global PortIn% = 25000
Global fntArialB = LoadFont("Arial",18,True)
Global RecMsg$
Global SndMsg$
Global PType%
Global Client%
Global ClientStrm
Global Server%
Global Join_IP$
Global Send_IP%
Global Serv_IP%
Global OpenChat%

Cam = CreateCamera()
PositionEntity Cam,0,200,-20


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

If Choice = "h" Or Choice = "H" Then
   Server = CreateTCPServer(PortIn) ;Server listens on 25000
   
   ;Check if Server was created
   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.231]")
   If Len(Join_IP) = 0 Then Join_IP = "192.168.0.231" ;if no ip addy is given, this is the default
   
   Client = OpenTCPStream(Join_IP,PortIn) ;Client Listens on 25000
   
   ;Check if client connected to server
   If Client <> 0 Then
      Status = "Client connected to "+Join_IP
   Else
      Status = "Error starting client."
   EndIf
   
   PType = 2 ;Is Player a Client?
EndIf


Color 0,255,0
SetFont fntArialB

While Not KeyHit(1)
   Check_Keys()
   
   If PType = 1 Then ;Player is a server
      ;Check for new stream
      strStrm = AcceptTCPStream(Server)
      ;if there is a new stream, capture the stream
      If strStrm Then
         ClientStrm = strStrm
      Else
         ;if there is a captured stream check if there is a message in it
         If ClientStrm <> 0
            If ReadAvail(ClientStrm) Then
               Send_IP = TCPStreamIP(ClientStrm) ;Get IP Address of Message Sender
               RecMsg = ReadLine$(ClientStrm) ;Get the message from the stream
            EndIf
         EndIf
      EndIf
         
   EndIf
   If PType = 2 Then ;Player is a client
      ;check if there is a message in the stream
      If ReadAvail(Client) Then
         Send_IP = TCPStreamIP(Client) ;Get IP Address of Message Sender
         RecMsg = ReadLine$(Client) ;Get the message from the stream
      End If
   EndIf
   
   UpdateWorld()
   RenderWorld()
   
   Text 10,20,"Status: "+Status
   Text 10,40,"[Press any keys to type a message, return to send it]"
   Text 10,60,"[Press enter to send a message, press esc to exit]"
   Text 10,80,"[Client must send first message so server can capture Client Stream]"
   Text 10,100,"strStrm: "+strStrm
   Text 10,120,"ClienStrm: "+ClientStrm
   Text 10,140,"Port: "+PortIn
   Text 10,160,"PType: "+PType
   Color 0,0,255
   If RecMsg <> "" Then Text 10,340,Send_IP+": "+RecMsg
   Color 0,255,0
   Text 10,370,">: "+SndMsg
   Flip
   
Wend
If PType = 1 Then
   If ClientStrm <> 0 Then
      ;Close Server stream and server
      CloseTCPStream(ClientStrm)
      CloseTCPServer(Server)
   EndIf
EndIf
If PType = 2 Then CloseTCPStream(Client) ;Close client TCP Stream
ClearWorld()
End()

Function Check_Keys()
   ;Grab any keys that get pressed
   TKey% = GetKey()
   
   If TKey <> 0 Then
      If Tkey <> 8 Then ;8 = backspace key
         ;convert pressed key to the actual character
         TChr$ = Chr$(TKey)
         ;append string with last key pressed
         SndMsg = SndMsg + TChr
      Else
         ;if backspace key is hit, erase last letter of message
         If Len(SndMsg) > 0 Then SndMsg = Left(SndMsg,Len(SndMsg)-1)
      EndIf
   EndIf
   
   ;hitting enter key will send contents of sndmsg to client/server
   If KeyHit(28) Then ;Enter key
      If PType = 1 And ClientStrm <> 0 And SndMsg <> "" Then ;Player is a host, send message to client
         ;send message to Client
         WriteLine(ClientStrm,SndMsg)
      EndIf
      
      If PType = 2 Then ;And SndMsg <> "" Then ;Player is a client, send message to server
         ;Send message to server
         WriteLine(Client,SndMsg)
      EndIf
      SndMsg = "" ;message was sent, clear message to make room for a new message
      OpenChat = 0
   EndIf
End Function


Mfg,
N0X

//EDIT:
Der Fehler tritt beim joinen auf, wenn er das erste Mal was schicken will.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
  • Zuletzt bearbeitet von N0X am Sa, Aug 08, 2009 15:04, insgesamt einmal bearbeitet

mpmxyz

BeitragFr, Aug 07, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Frage: Wo liegt der Fehler? Und was ist es für einer?
Bei mir läuft alles über LAN wunderbar...
Schaue mal, ob deine Firewall das Programm blockiert.
Zitat:
[Client must send first message so server can capture Client Stream]

Das stimmt aber nicht.
Der Server kann auch ohne gesendete Nachricht den Client finden.

Vielleicht habe ich dein Problem übersehen.
Sage also am Besten, was bei dir beim Ausführen geschieht.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

N0X

BeitragFr, Aug 07, 2009 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich starte den Chat als Host auf meinem PC und als Client auf meinem Laptop.
Sobald ich auf meinem Laptop die IP des PC's eingegeben hab, zeigt er mir 'Stream does not exist' in der 'WriteLine' Zeile:
Code: [AUSKLAPPEN]
      If PType = 2 Then ;And SndMsg <> "" Then ;Player is a client, send message to server
         ;Send message to server
         WriteLine(Client,SndMsg)
      EndIf


//EDIT:
Ich habe eben auch noch andere Chat's probiert und festgestellt das keiner von denen funzt.
Liegt's vielleicht an Manueller IP-Vergabe?

Die Verbindung sonst, läuft stabil mit 100MBit's.
Beide in einem Netzwerk, Datenaustausch möglich.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragFr, Aug 07, 2009 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
"Client" ist 0, weil keine Verbindung hergestellt werden konnte.
Durch den IP-Input wurde die Entertaste gedrückt und daher möchte das Programm eine Nachricht senden.
Da der Stream aber nicht existiert, gibt es diese Meldung.

Schaue dir mal den Wert von "Client" im Debugger an.
Probiere Server und Client zusammen an einem Computer aus.
Schalte deine Firewall mal zum LAN-Test für kurze Zeit aus.
Das Problem liegt aber auf alle Fälle irgendwo bei der Verbindung und nicht am Code.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

N0X

BeitragFr, Aug 07, 2009 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich mir den Wert denn angucken?
An einem Pc mit lokaler IP funzt.
Mit ausgeschalteter Firewall auf 2 PC's funzt nicht.
Alle Windows-Funktionen über LAN funktionieren ja, nur in BlitzBasic klappt's dann nicht.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragFr, Aug 07, 2009 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst den Debugger nutzen und dort bei dem Zusatzfenster nach der Variable "Client" suchen oder du schreibst für das nächste Auführen einen Runtimeerror nach "Client=...", der diese Variable ausgibt.
Dass es im LAN nicht funktioniert ist aber wirklich seltsam, wenn du sogar auf z.B. die freigegebenen Dateien des anderen Computers zugreifen kannst.
Ich habe jetzt keine Idee mehr.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xaymar

ehemals "Cgamer"

BeitragSa, Aug 08, 2009 0:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Manuelle IP Vergabe... Verursacht oft probleme sofern der Router so eingestellt ist das der die IP's automatisch vergeben soll. Zumindest hier.

Habs mal getestet:
mit manueller ipvergabe:
Stream does not exist

ohne:
funzt problemlos

Firewall war beidesmal an(Windows und HardwareFirewall)
Warbseite

N0X

BeitragSa, Aug 08, 2009 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, beim Router ist die IP-Vergabe auf Automatisch eingestellt.
Bei meiner LAN-Verbindung, auf Manuell.
Allerdings kann ich das auch nicht umstellen, da er sonst 'Eingeschränkte oder keine Konnektivität' anzeigt.
Dann kann ich keine Daten austauschen, nicht mal den Computer "sehen".(Netzwerkumgebung->Arbeitsgruppencomputer anzeigen)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

hazumu-kun

BeitragSa, Aug 08, 2009 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
In einem Standardmäßigem LAN müsste Automatische IP-Vergabe in jedem Fall funktionieren, jedenfalls für deine Zwecke.

Was hastn da kaputtkonfiguriert?
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

N0X

BeitragSa, Aug 08, 2009 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich 'hab die IP komplett kaputtkonfiguriert ^^
Naja hat sich geklärt, war falsche Subnetzmaske und falscher Port.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group