107961
Goto Top

Chat Programm über TCP

Moin,

ich habe ein kleines Chatprogramm mit AutoIt geschrieben. Das eigentliche Problem ist allerdings nicht das Programm selber sondern der Verbindungsaufbau. Ich habe das Ganze mal über 127.0.0.1 ausprobiert und das hat wunderbar funktioniert, sowie ich aber die öffentliche IP nehme schlägt der Verbindungsaufbau fehl. Wie und wo muss ich da jetzt Ports freigeben damit mein Server funktioniert?

Quellcode Server:
;===< Server >=============================================

;===< Variablen >==========================================

#include <Inet.au3>

Opt("TCPTimeout",1000)  

$ipadress = _GetIP()
$port = "54321"  
$maxuser = 100
For $num = 1 To $maxuser
   Assign("socket"&$num,-1)  
Next

;===< Start >==============================================

;===< TCP starten und Socke erstellen >====================

TCPStartup()
$mainsocket = TCPListen($ipadress,$port,$maxuser)

;===< GUI erstellen >======================================

GUICreate("Server",120,100)  
   GUICtrlCreateLabel($ipadress,1,1,118,68)
   $button = GUICtrlCreateButton("Beenden",1,71,118,28)  
GUISetState()

;===< Aktionen ausführen >=================================

Do

;===< Verbindungen annehmen >==============================

   For $num = 1 To $maxuser
	  If Eval("socket"&$num) > -1 Then  
		 ContinueLoop
	  Else
		 $socket = TCPAccept($mainsocket)
		 Assign("socket"&$num,$socket)  
		 ExitLoop
	  EndIf
   Next

;===< Nachrichten weiterleiten >===========================

   For $num1 = 1 To $maxuser
	  $recv = TCPRecv(Eval("socket"&$num1),2048)  
	  If $recv <> "" Then  
		 For $num2 = 1 To $maxuser
			$send = TCPSend(Eval("socket"&$num2),$recv)  
			If @error Then
			   Assign("socket"&$num2,-1)  
			EndIf
		 Next
	  Else
		 ContinueLoop
	  EndIf
   Next

;===< GUI überprüfen und beenden >=========================

   $msg = GUIGetMsg()
Until $msg = $button

GUIDelete()
TCPCloseSocket($mainsocket)
TCPShutdown()

;===< Ende >===============================================

Quellcode Client:
;===< Client >=============================================

;===< Variablen >==========================================

#include <GUIConstantsEx.au3>

Opt("TCPTimeout",1000)  

$ipadress = InputBox("","Server-IP eingeben:","XXX.XXX.XXX.XXX")  
$port = "54321"  
$name = InputBox("","Name eingeben:")  

;===< Start >==============================================

;===< TCP starten und Verbindung herstellen >==============

TCPStartup()
$mainsocket = TCPConnect($ipadress,"54321")  

For $try = 1 To 10
   If $mainsocket > 0 Then
	  $data = "Verbunden mit: "&$ipadress  
   Else
	  If $try < 10 Then ContinueLoop
	  MsgBox(0,"Fehler","Es konnte keine Verbindung hergestellt werden")  
	  Exit
   EndIf
Next

;===< GUI erstellen >======================================

GUICreate("Chatprogramm",500,500)  
   $display = GUICtrlCreateEdit($data,0,0,500,470)
   $input = GUICtrlCreateInput("",0,470,450,30)  
   $button = GUICtrlCreateButton("Senden",450,470,50,30)  
GUISetState()

;===< Aktionen ausführen >=================================

Do
   $msg = GUIGetMsg()

;===< Nachricht senden >===================================

   If $msg = $button Then
	  TCPSend($mainsocket,$name&": "&GUICtrlRead($input))  
   EndIf

;===< Nachrichten empfangen >==============================

   $recv = TCPRecv($mainsocket,2048)
   If $recv <> "" Then  
	  $data = $data&@CRLF&$recv
	  GUICtrlSetData($display,$data)
   EndIf

Until $msg = $GUI_Event_Close

;===< Ende >===============================================

Also der Server setzt die IP automatisch und der Client muss eine IP angeben zu der die Verbindung hergestellt werden soll.

ServerIP = 127.0.0.1 und Client gibt 127.0.0.1 ein geht.
ServerIP = _GetIP (öffentliche IP) und Client gibt die vom Server angezeigte IP ein geht nicht.

Ich hoffe ihr habt ne Lösung parat

Content-ID: 193977

Url: https://administrator.de/contentid/193977

Ausgedruckt am: 26.11.2024 um 07:11 Uhr

MrNetman
MrNetman 08.11.2012 um 21:16:43 Uhr
Goto Top
127.0.0.1 ist keine reale IP Localhost. Das ist jeweils die eigene. Also verbindet sich der Client auf sein eigenes Interface und führt Selbstgespräche.

Gruß Netman
107961
107961 08.11.2012 um 21:26:27 Uhr
Goto Top
Das ist mir schon klar ;)
ich hatte zum testen nur einfach mal den Server mit 127.0.0.1 und 2 Clienten auf meinem Computer gestartet um zu gucken ob das Hin- und Herschicken von Nachrichten klappt.
Lochkartenstanzer
Lochkartenstanzer 08.11.2012 um 21:54:56 Uhr
Goto Top
Port 54321 in der windows-Firewall freigeben.

Was ist das Problem?
Aba-it
Aba-it 09.11.2012 um 00:29:53 Uhr
Goto Top
Hallo

Meinst du mit der öffentlichen IP, die welche du von deinem ISP erhalten hast oder die des Computers im lokalen Netzwerk?

Falls die vom ISP, musst du in dem Fall logischerweise den Port 54321 auf den Server weiterleiten und - wie lks bereits meinte - deine Firewallkonfiguration entsprechend anpassen.

Gruss
Lochkartenstanzer
Lochkartenstanzer 09.11.2012 aktualisiert um 07:56:44 Uhr
Goto Top
Aus dem Servercode:

$ipadress = _GetIP()

Ich kenne mich mit AutoIT nicht aus (echte Programmierer benutzen Fortran (oder Fortran in C geschrieben face-smile), aber liefert _getIP alle IP-Adressen zurück?

eventuell hast Du nur eine Bindung an eine einzige IP-Adresse statt auf allen. ggf mit 0.0.0.0 als IP-Adresse für den Listen-Befehl benutzen.

lks

Nachtrag:

ich habe mal google angeworfen (geht ganz einfach) und der erste Treffer war: http://www.autoitscript.com/autoit3/docs/libfunctions/_GetIP.htm

Irgendwie kann das so, wie Du es hingeschrieben hast,

$mainsocket = TCPListen($ipadress,$port,$maxuser)

nicht funktioneren, weil die "öffentliche" IP-Adresse an kein Interface deines computers gebunden ist.


nachtrag2:

Und wie b4tcher schon sagte, Port-Forwarding nicht vergessen!
107961
107961 09.11.2012 um 10:01:31 Uhr
Goto Top
Danke erstmal für die Antworten

Jetzt hab ich nochmal ein paar neue Fragen:

Wie binde ich die IP denn an ein Interface(<-Was ist das?)

Und wie genau funktioniert Port-Forwarding? Heißt das der Router bekommt die Nachricht vom Clienten auf Port 54321 und muss die dann an die lokale NetzwerkIP des Rechners weiterleiten?

Die Portfreigabe in der Windowsfirewall hab ich leider nicht gefunden.

Ich hoffe ihr könnt mir das genauer erklären

Gruß BOBO