#RequireAdmin
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.8.0
Author: S1R1US[B.S.]
Script Function:
MTRD Server.
#ce ----------------------------------------------------------------------------
;SERVER!! Start Me First !!!!!!!!!!!!!!!
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>
#include <EditConstants.au3>
#include <GuiEdit.au3>
Global $g_IP = @IPAddress1
; Start The TCP Services
;==============================================
TCPStartup()
; Create a Listening "SOCKET"
;==============================================
Global $SocketNumber = 3
Global $Ports[$SocketNumber] = [33891, 33892, 33893]
Global $MainSocket[$SocketNumber]
Global $ConnectedSocket[$SocketNumber]
Global $data[$SocketNumber]
For $i = 0 To $SocketNumber-1
$MainSocket[$i] = TCPListen($g_IP, $Ports[$i], 100)
If $MainSocket[$i] = -1 Then Exit
$RogueSocket = $ConnectedSocket[$i]-1
$data[$i] = ""
Next
; Create a GUI for chatting
;==============================================
$GOOEY = GUICreate("messenger Admin - " & @ComputerName, 670, 600, @DesktopWidth / 2 + 100, @DesktopHeight / 2 - 350)
$edit = GUICtrlCreateEdit("", 10, 10, 480, 400, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN + $ES_READONLY)
$input = GUICtrlCreateInput("", 10, 420, 480, 130)
$butt = GUICtrlCreateButton("ОТПРАВИТЬ", 10, 560, 80, 30)
$ochistka = GUICtrlCreateButton("ОЧИСТИТЬ", 90, 560, 80, 30)
$clientlist = GUICtrlCreateList("", 500, 10, 160, 580, $GUI_SS_DEFAULT_LIST + $LBS_NOINTEGRALHEIGHT) ; создаем элемент списка
GUICtrlSetData($clientlist, 'Администратор', 'Администратор')
GUICtrlSetLimit(-1, 200) ; ограничить прокрутку по горизонтали
GUISetState()
GUICtrlSetData($edit, "", 1); вставить начальную строку в поле Edit
GUICtrlSetData($input, "Status Online", 1); вставить начальную строку в поле Edit чата
GUICtrlSetState($butt, $GUI_DEFBUTTON); установка кнопки Отправить кнопкой по умолчанию
; GUI Message Loop
;==============================================
While 1
$msg = GUIGetMsg()
For $i = 0 To $SocketNumber-1
; GUI Closed
;--------------------
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
; User Pressed SEND
;--------------------
If $msg = $butt Then
If $ConnectedSocket[$i] > -1 Then
$ret = TCPSend($ConnectedSocket[$i], ">>Администратор " & "(" & @HOUR & ":" & @MIN & ":" & @SEC & ")" & ": " & GUICtrlRead($input))
If @error Then
; ERROR OCCURRED, CLOSE SOCKET AND RESET ConnectedSocket to -1
;----------------------------------------------------------------
TCPCloseSocket($ConnectedSocket[$i])
WinSetTitle($GOOEY, "", "MTRD Server " & @ComputerName)
$ConnectedSocket[$i] = -1
ElseIf $ret > 0 Then
; UPDATE EDIT CONTROL WITH DATA WE SENT
;----------------------------------------------------------------
_GUICtrlEdit_AppendText($edit, ">>Администратор " & " (" & @HOUR & ":" & @MIN & ":" & @SEC & ")" & ": " & GUICtrlRead($input) & @CRLF)
EndIf
EndIf
GUICtrlSetData($input, "")
EndIf
If $RogueSocket > 0 Then
$recv = TCPRecv($RogueSocket, 2048)
If Not @error Then
TCPCloseSocket($RogueSocket)
$RogueSocket[$i] = -1
EndIf
EndIf
; If no connection look for one
;--------------------
If $ConnectedSocket[$i] = -1 Then
$ConnectedSocket[$i] = TCPAccept($MainSocket[$i])
If $ConnectedSocket[$i] >= 0 Then
WinSetTitle($GOOEY, "", "Server Running - " & @ComputerName)
EndIf
; If connected try to read some data
;--------------------
Else
; EXECUTE AN UNCONDITIONAL ACCEPT IN CASE ANOTHER CLIENT TRIES TO CONNECT
;----------------------------------------------------------------
$RogueSocket = TCPAccept($MainSocket[$i])
If $RogueSocket > 0 Then
TCPSend($RogueSocket, "~~rejected")
EndIf
$recv = TCPRecv($ConnectedSocket[$i], 1024)
If $recv <> "" And $recv <> "~~bye" Then
; UPDATE EDIT CONTROL WITH DATA WE RECEIVED
;----------------------------------------------------------------
_GUICtrlEdit_AppendText($edit, ">" & $recv & @CRLF)
ElseIf @error Or $recv = "~~bye" Then
; ERROR OCCURRED, CLOSE SOCKET AND RESET ConnectedSocket to -1
;----------------------------------------------------------------
WinSetTitle($GOOEY, "", "server Online " & @IPAddress1)
TCPCloseSocket($ConnectedSocket[$i])
$ConnectedSocket[$i] = -1
EndIf
EndIf
Next
WEnd
GUIDelete($GOOEY)
Func OnAutoItExit()
;ON SCRIPT EXIT close opened sockets and shutdown TCP service
;----------------------------------------------------------------------
If $ConnectedSocket[$i] > -1 Then
TCPSend($ConnectedSocket[$i], "~~bye")
Sleep(2000)
TCPRecv($ConnectedSocket[$i], 512)
TCPCloseSocket($ConnectedSocket[$i])
EndIf
TCPCloseSocket($MainSocket[$i])
TCPShutdown()
EndFunc ;==>OnAutoItExit
Func SOCKET2IP($SHOCKET)
Local $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$a = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, "ptr", DllStructGetPtr($sockaddr), _
"int_ptr", DllStructGetSize($sockaddr))
If Not @error And $a[0] = 0 Then
$a = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $a = $a[0]
Else
$a = 0
EndIf
; release Struct not really needed as it is a local
$sockaddr = 0
Return $a
EndFunc ;==>SOCKET2IP