Chat übers Inter-Netzt??:)

05/20/2010 14:35 arisha#1
Hallllliiii halloo, habe einen chat server ....aber der Funzt nur über lan....
Wie mach ich jetzt das der Server ans Netzt geht (ports) und der Client sich mit dem Port verbindet??

Wenn möglich sollen die momentanen Admin befehle bleiben....



Der Server:
Code:
#Include <ButtonConstants.Au3>
#Include <EditConstants.Au3>
#Include <GUIConstantsEx.Au3>
#Include <StaticConstants.Au3>
#Include <WindowsConstants.Au3>
#Include <File.Au3>
#Include <String.Au3>
#NoTrayIcon

Opt ('GUIOnEventMode', 1)

Global $Max = 10, $Socket[$Max + 1], $User[$Max + 1], $Server = -1, $Admin = -1, $Admin_Pw = 'password', $Connected = 0
For $A = 1 To $Max
	$Socket[$A] = -1
	$User[$A] = -1
Next

$GUI = GUICreate ('Server Settings', 180, 100, -1, -1, -1, 128)
GUISetOnEvent  ($GUI_EVENT_CLOSE, '_Exit')
GUICtrlCreateGroup  ('', 5, 0, 170, 94)
$IP = GUICtrlCreateInput (@IpAddress1, 12, 13, 100, 21, 1)
$Port = GUICtrlCreateInput (50, 117, 13, 50, 21, 1)
$Start = GUICtrlCreateButton ('Start', 12, 39, 46, 20, $WS_GROUP)
GUICtrlSetOnEvent ($Start, '_Start')
$Stop = GUICtrlCreateButton ('Stop', 63, 39, 49, 20, $WS_GROUP)
GUICtrlSetState ($Stop, $GUI_DISABLE)
GUICtrlSetOnEvent ($Stop, '_Stop')
$Pw = GUICtrlCreateInput ($Admin_Pw, 12, 65, 100, 21, BitOr (1, $ES_PASSWORD))
$Set = GUICtrlCreateButton ('Set Pw', 118, 66, 49, 20, $WS_GROUP)
GUICtrlSetOnEvent ($Set, '_Set')
GUISetState (@SW_SHOW)
WinSetOnTop ($GUI, '', 1)

While 1
	If $Server <> -1 Then
		If $Connected < $Max Then
			$Accept = TcpAccept ($Server)
			If $Accept <> -1 Then
				If _IsBanned (_SocketGetIP ($Accept)) = 0 Then
					$Open = _Open ()
					$Timer = TimerInit ()
					Do
						Sleep (15)
						$Recv = TcpRecv ($Accept, 1000000)
					Until $Recv <> '' Or TimerDiff ($Timer) >= 500
					If $Recv <> '' Then
						If _Check ($Recv) = 1 Then
							$User[$Open] = $Recv
							$Socket[$Open] = $Accept
							$Connected = $Connected + 1
							_SendAll ('[%Time] ' & $User[$Open] & ' has connected.')
						Else
							TcpSend ($Accept, 'Error:Username.Exists;')
							Sleep (250)
							TcpCloseSocket ($Accept)
						EndIf
					Else
						TcpCloseSocket ($Accept)
					EndIf
				Else
					TcpSend ($Accept, 'Error:IP.Banned;')
					Sleep (250)
					TcpCloseSocket ($Accept)
				EndIf
			EndIf
		ElseIf $Connected = $Max Then
			$Accept = TcpAccept ($Server)
			If $Accept <> -1 Then
				$Timer = TimerInit ()
				Do
					Sleep (15)
					$Recv = TcpRecv ($Accept, 1000000)
				Until $Recv <> '' Or TimerDiff ($Timer) >= 500
				Sleep (250)
				TcpSend ($Accept, 'Error:Max.Connections;')
				TcpCloseSocket ($Accept)
			EndIf
		EndIf
		For $A = 1 To $Max
			If $Socket[$A] <> -1 And $User[$A] <> -1 Then
				$Recv = TcpRecv ($Socket[$A], 1000000)
				If @Error Then _Disconnect ($A)
				If $Recv <> '' Then
					If StringLeft ($Recv, 6) = '.admin' Then
						If $Admin <> -1 Then
							TcpSend ($Socket[$A], '[%Time] Server : An admin is already logged in.')
						Else
							If StringTrimLeft ($Recv, 7) == $Admin_Pw Then
								$Admin = $User[$A]
								_SendAll ('[%Time] ' & $User[$A] & ' is now an admin.')
							Else
								TcpSend ($Socket[$A], '[%Time] Server : Incorrect admin password.')
							EndIf
						EndIf
					ElseIf StringLeft ($Recv, 7) = '.logout' Then
						If $User[$A] == $Admin Then
							$Admin = -1
							_SendAll ('[%Time] ' & $User[$A] & ' is no longer an admin.')
						Else
							TcpSend ($Socket[$A], '[%Time] Server : You do not have this power.')
						EndIf
					ElseIf StringLeft ($Recv, 5) = '.kick' Then
						If $User[$A] == $Admin Then
							$Who = StringTrimLeft ($Recv, 6)
							If $Who = $Admin Then
								TcpSend ($Socket[$A], '[%Time] Server : You cannot kick an admin.')
							ElseIf _UserGetSocket ($Who) <> -1 Then
								_Disconnect (_UserGetSocket ($Who))
							Else
								TcpSend ($Socket[$A], '[%Time] Server : User does not exist.')
							EndIf
						Else
							TcpSend ($Socket[$A], '[%Time] Server : You do not have this power.')
						EndIf
					ElseIf StringLeft ($Recv, 6) = '.stats' Then
						$Stats = @CRLF & 'Total Online : ' & $Connected & @CRLF
						For $B = 1 To $Max
							If $Socket[$B] <> -1 And $User[$B] <> -1 Then
								$Stats = $Stats & '[' & $B& '] ' & $User[$B] & @CRLF
							EndIf
						Next
						TcpSend ($Socket[$A], $Stats)
					ElseIf StringLeft ($Recv, 3) = '.ip' Then
						If $User[$A] == $Admin Then
							$Who = StringTrimLeft ($Recv, 4)
							$wID = _UserGetSocket ($Who)
							If $wID <> -1 Then
								TcpSend ($Socket[$A], '[%Time] Server : ' & $Who & "'s IP : " & _SocketGetIP ($Socket[$wID]))
							Else
								TcpSend ($Socket[$A], '[%Time] Server : User does not exist.')
							EndIf
						Else
							TcpSend ($Socket[$A], '[%Time] Server : You do not have this power.')
						EndIf
					ElseIf StringLeft ($Recv, 4) = '.ban' Then
						If $User[$A] == $Admin Then
							$Who = StringTrimLeft ($Recv, 5)
							$wID = _UserGetSocket ($Who)
							If $Who = $Admin Then
								TcpSend ($Socket[$A], '[%Time] Server : You cannot ban an admin.')
							ElseIf $wID <> -1 Then
								$IP = _SocketGetIP ($Socket[$wID])
								FileWriteLine ('Banned.txt', $IP)
								For $B = 1 To $Max
									If $Socket[$B] <> -1 And $User[$B] <> -1 Then
										If _SocketGetIP ($Socket[$B]) = $IP Then _Disconnect ($B)
									EndIf
								Next
								_SendAll ('[%Time] IP : ' & $IP & ' has been banned.')
								Sleep (500)
								TcpSend ($Socket[$A], '.log Ban Added : Username : ' & $Who & ', IP : ' & $IP)
							Else
								TcpSend ($Socket[$A], '[%Time] Server : User does not exist.')
							EndIf
						Else
							TcpSend ($Socket[$A], '[%Time] Server : You do not have this power.')
						EndIf
					ElseIf StringLeft ($Recv, 6) = '.unban' Then
						If $User[$A] == $Admin Then
							$IP = StringTrimLeft ($Recv, 7)
							If _IsBanned ($IP) = 1 Then
								_Remove ($IP)
								_SendAll ('[%Time] IP ' & $IP & ' is un-banned.')
								Sleep (500)
								TcpSend ($Socket[$A], '.log Ban Removed : ' & $IP)
							Else
								TcpSend ($Socket[$A], '[%Time] Server : ' & $IP & ' is not banned.')
							EndIf
						Else
							TcpSend ($Socket[$A], '[%Time] Server : You do not have this power.')
						EndIf
					Else
						_SendAll ('[%Time] ' & $User[$A] & ' says : ' & $Recv)
					EndIf
				EndIf
			EndIf
		Next
	EndIf
	Sleep (15)
WEnd

Func _IsBanned ($Data)
	For $A = 1 To _FileCountLines ('Banned.txt')
		If FileReadLine ('Banned.txt', $A) = $Data Then Return 1
	Next
	Return 0
EndFunc

Func _Remove ($IP)
	$Count = _FileCountLines ('Banned.txt')
	If $Count = 1 And FileReadLine ('Banned.txt', 1) = $IP Then
		FileDelete ('Banned.txt')
	ElseIf $Count > 0 Then
		For $A = 1 To $Count
			$Line = FileReadLine ('Banned.txt', $A)
			If $Line <> $IP Then FileWriteLine ('Banned_Temp.txt', $Line)
		Next
	EndIf
	FileCopy ('Banned_Temp.txt','Banned.txt', 1)
	FileDelete ('Banned_Temp.txt')
EndFunc

Func _SocketGetIP ($Data)
	Local $Struct, $Return
	$Struct = DllStructCreate ('short;ushort;uint;char[8]')
    $Return = DllCall ('Ws2_32.dll','int','getpeername','int', $Data, 'ptr', DllStructGetPtr ($Struct), 'int*', DllStructGetSize($Struct))
	If @Error Or $Return[0] <> 0 Then Return 0
	$Return = DllCall ('Ws2_32.dll','str','inet_ntoa','int', DllStructGetData ($Struct, 3))
	If @Error Then Return 0
	$Struct = 0
	Return $Return[0]
EndFunc

Func _UserGetSocket ($Data)
	For $A = 1 To $Max
		If $User[$A] = $Data Then Return $A
	Next
	Return -1
EndFunc

Func _Check ($Data)
	For $A = 1 To $Max
		If $User[$A] = $Data Then Return 0
	Next
	Return 1
EndFunc

Func _Disconnect ($ID)
	_SendAll ('[%Time] ' & $User[$ID] & ' has disconnected.')
	If $User[$ID] = $Admin Then $Admin = -1
	TcpCloseSocket ($Socket[$ID])
	$Socket[$ID] = -1
	$User[$ID] = -1
	$Connected = $Connected - 1
EndFunc

Func _SendAll ($Msg)
	For $A = 1 To $Max
		If $Socket[$A] <> -1 And $User[$A] <> -1 Then
			TcpSend ($Socket[$A], $Msg)
		EndIf
	Next
EndFunc

Func _Open ()
	For $A = 1 To $Max
		If $Socket[$A] = -1 And $User[$A] = -1 Then Return $A
	Next
EndFunc

Func _Start ()
	If GUICtrlRead ($IP) == '' Or GUICtrlRead ($Port) == '' Then Return @Error
	TcpStartUp ()
	$Server = TcpListen (GUICtrlRead ($IP), GUICtrlRead ($Port))
	If $Server = -1 Or @Error Then
		WinSetOnTop ($GUI, '', 0)
		Sleep (100)
		MsgBox (16, 'Fatal Error','Unable to start the server, change your settings and try again.')
		WinSetOnTop ($GUI, '', 1)
		TcpCloseSocket ($Server)
		_Reset ()
	Else
		GUICtrlSetState ($IP, $GUI_DISABLE)
		GUICtrlSetState ($Port, $GUI_DISABLE)
		GUICtrlSetState ($Start, $GUI_DISABLE)
		GUICtrlSetState ($Stop, $GUI_ENABLE)
	EndIf
EndFunc

Func _Stop ()
	TcpCloseSocket ($Server)
	$Server = -1
	$Connected = 0
	$Admin = -1
	_Reset ()
EndFunc

Func _Set ()
	$Admin_Pw = GUICtrlRead ($Pw)
EndFunc

Func _Reset ()
	For $A = 1 To $Max
		If $Socket[$A] <> -1 Or $User[$A] <> -1 Then
			TcpCloseSocket ($Socket[$A])
			$Socket[$A] = -1
			$User[$A] = -1
		EndIf
	Next
	TcpShutDown ()
	GUICtrlSetState ($IP, $GUI_ENABLE)
	GUICtrlSetState ($Port, $GUI_ENABLE)
	GUICtrlSetState ($Start, $GUI_ENABLE)
	GUICtrlSetState ($Stop, $GUI_DISABLE)
EndFunc

Func _Exit ()
	Exit
EndFunc


Der Client:

Code:
#Include <ButtonConstants.Au3>
#Include <EditConstants.Au3>
#Include <GUIConstantsEx.Au3>
#Include <StaticConstants.Au3>
#Include <WindowsConstants.Au3>
#Include <GUIEdit.Au3>
#Include <Misc.Au3>
#NoTrayIcon 
 
Global $pid = Run("global\load_gui.exe", "", "", "")
Opt ('GUIOnEventMode', 1)
TcpStartUp () 

Global $Server = -1, $Logs  

$Settings = GUICreate ('Connection Settings', 180, 100, -1, -1, -1, 128) 
GUISetOnEvent  ($GUI_EVENT_CLOSE, '_Exit')
GUICtrlCreateGroup  ('', 5, 0, 170, 94)
$IP = GUICtrlCreateInput (IniRead ('Settings.ini','Settings','IP', @IpAddress1), 12, 13, 100, 21, 1)
$Port = GUICtrlCreateInput (IniRead ('Settings.ini','Settings','Port', 50), 117, 13, 50, 21, 1)
$User = GUICtrlCreateInput (IniRead ('Settings.ini','Settings','User','John'), 12, 39, 156, 21, 1)
$Connect = GUICtrlCreateButton ('Connect', 12, 66, 100, 20, $WS_GROUP)
GUICtrlSetOnEvent ($Connect, '_Start')
$Exit = GUICtrlCreateButton ('Exit', 117, 66, 50, 20, $WS_GROUP)
GUICtrlSetOnEvent ($Exit, '_Exit')
GUISetState (@SW_SHOW)
WinSetOnTop ($Settings, '', 1)

$GUI = GUICreate ('TCP Chat Room', 375, 275, -1, -1, -1, 128)
GUISetOnEvent ($GUI_EVENT_CLOSE, '_Toggle')
$History = GUICtrlCreateEdit ('', 0, 1, 375, 203, 2103360 + $ES_MULTILINE)
GUICtrlSetFont ($History, 10, -1, -1, 'Lucida Sans Unicode')
GUICtrlSetBkColor ($History, 0x83B4FC)
GUICtrlSetColor ($History, 0xFFFFFF)
$Send = GUICtrlCreateEdit ('', 0, 205, 375, 70, 2101248)
GUICtrlSetFont ($Send, 10, -1, -1, 'Lucida Sans Unicode')
GUICtrlSetColor ($Send, 0x83B4FC)
GUISetState (@SW_HIDE)

While 1
	Sleep (15)
	If $Server <> -1 Then
		$Recv = TcpRecv ($Server, 1000000)
		If @Error Then
			GUISetState (@SW_HIDE, $GUI)
			WinSetOnTop ($GUI, '', 0)
			Sleep (100)
			MsgBox (48, 'Server Notice','You have been disconnected from the server.')
			_Disconnect ()
		EndIf
		If $Recv = 'Error:Username.Exists;' Then
			GUISetState (@SW_HIDE, $GUI)
			WinSetOnTop ($GUI, '', 0)
			Sleep (100)
			MsgBox (48, 'Server Notice','Your username is already in use, please change it and try again.')
			_Disconnect ()
		ElseIf $Recv = 'Error:Max.Connections;' Then
			GUISetState (@SW_HIDE, $GUI)
			WinSetOnTop ($GUI, '', 0)
			Sleep (100)
			MsgBox (48, 'Server Notice','Max amount of connections reached, try again later.')
			_Disconnect ()
		ElseIf $Recv = 'Error:IP.Banned;' Then
			GUISetState (@SW_HIDE, $GUI)
			WinSetOnTop ($GUI, '', 0)
			Sleep (100)
			MsgBox (48, 'Server Notice','Your IP address has been banned.')
			_Disconnect ()
		ElseIf StringLeft ($Recv, 4) = '.log' Then
			FileWriteLine ('Logged.txt', StringTrimLeft ($Recv, 5))
		ElseIf $Recv <> '' Then
			_Log (StringReplace ($Recv, '%Time', @HOUR & ':' & @MIN))
		EndIf
		If _IsPressed ('0D') And GUICtrlRead ($Send) <> '' And ControlGetFocus ($GUI) = 'Edit2' Then
			$Read = StringReplace (GUICtrlRead ($Send), @CRLF, '')
			$Read = StringReplace ($Read, @CR, '')
			$Read = StringReplace ($Read, @LF, '')
			If $Read = '.clear' Then
				GUICtrlSetData ($History, '')
			ElseIf $Read = '.logs' Then
				_Logs ()
			ElseIf $Read = '.save' Then
				FileWrite (@MDAY & '-' & @MON & '-' & @YEAR & '_' & @HOUR & '-' & @MIN & '-' & @SEC & '_Logs.txt', GUICtrlRead ($History))
			ElseIf $Read = '.disconnect' Or $Read = '.exit' Then
				_Disconnect ()
			Else
				TcpSend ($Server, $Read)
			EndIf
			GUICtrlSetData ($Send, '')
		EndIf
	EndIf
WEnd

Func _Logs ()
	$Logs = GUICreate ('Admin Logs', 375, 203, -1, -1, -1, 128)
	GUISetOnEvent ($GUI_EVENT_CLOSE, '_Delete')
	$Edit = GUICtrlCreateEdit ('', 0, 1, 375, 203, 2103360 + $ES_MULTILINE)
	GUICtrlSetFont ($Edit, 10, -1, -1, 'Lucida Sans Unicode')
	GUICtrlSetBkColor ($Edit, 0x83B4FC)
	GUICtrlSetColor ($Edit, 0xFFFFFF)
	GUISetState (@SW_SHOW)
	GUICtrlSetData ($Edit, FileRead ('Logged.txt'))
	WinSetOnTop ($Logs, '', 1)
EndFunc

Func _Delete ()
	GUIDelete ($Logs)
EndFunc

Func _Disconnect ()
	GUICtrlSetData ($History, '')
	TcpCloseSocket ($Server)
	$Server = -1
	GUISetState (@SW_HIDE, $GUI)
	WinSetOnTop ($GUI, '', 0)
	GUISetState (@SW_SHOW, $Settings)
	WinSetOnTop ($Settings, '', 1)
EndFunc

Func _Toggle ()
	GUICtrlSetData ($History, '')
	TcpCloseSocket ($Server)
	$Server = -1
	GUISetState (@SW_HIDE, $GUI)
	WinSetOnTop ($GUI, '', 0)
	GUISetState (@SW_SHOW, $Settings)
	WinSetOnTop ($Settings, '', 1)
EndFunc

Func _Log ($Data)
	GUICtrlSetData ($History, GUICtrlRead ($History) & $Data & @CRLF)
	_GUICtrlEdit_LineScroll ($History, 0, _GUICtrlEdit_GetLineCount ($History) - 1)
EndFunc

Func _Start () 
	If GUICtrlRead ($User) == '' Or GUICtrlRead ($IP) == '' Or GUICtrlRead ($Port) == '' Then Return @Error
	$Server = TcpConnect (GUICtrlRead ($IP), GUICtrlRead ($Port))
	If $Server = -1 Or @Error Then
		WinSetOnTop ($Settings, '', 0)
		Sleep (100)
		MsgBox (16, 'Fatal Error','Unable to connect to the server, change your settings and try again.')
		WinSetOnTop ($Settings, '', 1)
		Return @Error
	EndIf
	Sleep (150)
	TcpSend ($Server, GUICtrlRead ($User))
	GUISetState (@SW_HIDE, $Settings)
	WinSetOnTop ($Settings, '', 0)
	GUISetState (@SW_SHOW, $GUI)
	WinSetOnTop ($GUI, '', 1)
EndFunc

Func _Exit ()
	IniWrite ('Settings.ini','Settings','IP', GUICtrlRead ($IP))
	IniWrite ('Settings.ini','Settings','Port', GUICtrlRead ($Port))
	IniWrite ('Settings.ini','Settings','User', GUICtrlRead ($User))
	Exit
EndFunc

Thx for Help!!!
05/20/2010 14:37 Elektrochemie#2
Eigentlich sollte der auch über's Netz gehen.
Falls du 'n Router hast, musst du den Server (zumindest geht das so bei meinem Router) auf deine interne Netzwerk IP forwarden.
05/20/2010 14:46 MrSm!th#3
natürlich geht es nicht so einfach :rolleyes:

normalerweise hat ein router eine firewall und die soll ja verhindern, dass jemand von außerhalb großartig ohne genehmigung auf die rechner zugreift.
wenn du deinen rechner wie einen (chat-)server nutzen willst, musst du die entsprechenden ports öffnen.

es wäre aber definitiv schlauer, den chat auf nem richtigen server laufen zu lassen, denn dafür sind die teile ja da.
nur dann kommst du wohl nicht mit autoit weiter