107961
08.11.2012, aktualisiert um 21:12:13 Uhr
5630
6
0
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:
Quellcode Client:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 193977
Url: https://administrator.de/contentid/193977
Ausgedruckt am: 26.11.2024 um 07:11 Uhr
6 Kommentare
Neuester Kommentar
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
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
Aus dem Servercode:
Ich kenne mich mit AutoIT nicht aus (echte Programmierer benutzen Fortran (oder Fortran in C geschrieben ), 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,
nicht funktioneren, weil die "öffentliche" IP-Adresse an kein Interface deines computers gebunden ist.
nachtrag2:
Und wie b4tcher schon sagte, Port-Forwarding nicht vergessen!
$ipadress = _GetIP()
Ich kenne mich mit AutoIT nicht aus (echte Programmierer benutzen Fortran (oder Fortran in C geschrieben ), 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!