#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>

TcpStartup()
$StartPort = 1
$EndPort = 3000;                  Hängt sich meist schon früher auf :~{
Dim $PortSocket[$EndPort+1]

$Form1 = GUICreate("FireShield - campweb", 621, 451, 192, 154)
$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 21)
$Group1 = GUICtrlCreateGroup("Geblockte Ports", 2, 2, 308, 425)
$Edit1 = GUICtrlCreateEdit("", 7, 17, 297, 403)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Ports auf die nicht zugegriffen werden konnte", 310, 2, 309, 425)
$Edit2 = GUICtrlCreateEdit("", 315, 17, 299, 403)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

While 1

	For $i = $StartPort To $EndPort
		$PortSocket[$i] = TcpListen(@IPAddress1, $i)
		If $PortSocket[$i] = -1 Then 
			GUICtrlSetData($Edit2, guictrlread($Edit2)&@crlf&$i)
			_GUICtrlStatusBar_SetText($StatusBar1, "Port "&$i&" kann nicht geöffnet werden")
		Else
			GUICtrlSetData($Edit1, guictrlread($Edit1)&@crlf&$i)
			_GUICtrlStatusBar_SetText($StatusBar1, "Port "&$i&" wird überwacht")
		EndIf
	Next
	
	_GUICtrlStatusBar_SetText($StatusBar1, "FireShield ist nun aktiv")
	
	Do
		For $i = $StartPort To $EndPort
			$ConnectedSocket = TCPAccept($PortSocket[$i])
			If $ConnectedSocket <> -1 Then
				TCPSend($ConnectedSocket,"Port "&$i&" ist durch FireShield blockiert!")
				_GUICtrlStatusBar_SetText(@MDAY&"/"&@MON&"-"&@YEAR&" "&@HOUR&":"&@MIN&":"&@SEC&" "&SocketToIP($ConnectedSocket)&" versuchte sich an Port: "&$i&" anzuschließen!")
				MsgBox(0, "FireShield", @MDAY&"/"&@MON&"-"&@YEAR&" "&@HOUR&":"&@MIN&":"&@SEC&" "&SocketToIP($ConnectedSocket)&" versuchte sich an Port: "&$i&" anzuschließen!")
				TCPCloseSocket($ConnectedSocket)
				$ConnectedSocket = -1
			EndIf
		Next
	Until $ConnectedSocket <> -1 Or GUIGetMsg() = $GUI_EVENT_CLOSE
WEnd


Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
            "ptr",DLLStructGetPtr($sockaddr),"int_ptr",DLLStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc