개발 관련/SW, App 관련

Autoit의 통신(TCP/IP) 이용 원격제어 2/2

by 소서리스25 2023. 6. 24.
반응형

Autoit의 통신(TCP/IP) 이용 원격제어 코드 내용

 

지난번 포스트에 이어 이번에는 몇 가지 중요 코드 설명과 제대로 동작하는지 영상으로 확인해 보고자 한다.

코드는 지난번에 포스팅한 내용을 참고하면 되며 그중에서 먼저 다음과 같이 서버 측 코드를 살펴보자

1
2
3
4
5
6
7
8
9
10
11
12
$serverIP = @IPAddress1;
$clientIP = "192.168.200.49";
$nPort = 5538;
 
GUICtrlSetData($DebugText, "log : Waiting..");
 
$ConnectedSocket = -1;
$ConnectedSocket_Rev = -1;
 
TCPStartUp();
 
$MainSocket = TCPListen($serverIP , $nPort);
cs

 

여기 1 ~ 2번째 줄은 현재 서버가 될 이 PC의 IP 주소와 전달받을 클라이언트의 IP 주소이다.

그리고3번째 줄은 포트번호이다. 이 번호는 통신 주소 간에 동일해야 한다.

7~8번은 수신데이터 값을 초기화하는 것으로 보면 된다.(사실 없어도 되긴 하다)

10, 12번 줄은 메인소켓으로 TCP/IP 통신 시작이며 현재의 IP주소로 수신하겠다고 설정하며 데이터가 들어오기를 대기한다고 보면 되겠다.

 

그러면 초기화 및 기본적인 설정과 통신 준비가 끝나고 대기 상태가 되었다.

수신 대기는 계속되어야 하므로 반복문으로 보면 되겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
While 1
    $ConnectedSocket_Rev = TCPAccept($MainSocket)
 
    If  $ConnectedSocket_Rev <> -1 Then
        $recv = TCPRecv($ConnectedSocket_Rev, 2048)
        If $recv <> -1 Then
            GUICtrlSetData($DebugText, "log : "&$recv);
        EndIf
    EndIf
 
    If @error Then
        MsgBox(4112"오류""Error : "&@error, 5)
        ExitLoop
    EndIf
 
    $nMsg = GUIGetMsg();
    Switch $nMsg;
        Case $GUI_EVENT_CLOSE
            _Exit();
 
        Case $Button1
            $ConnectedSocket = TCPConnect($clientIP, $nPort);
            TCPSend($ConnectedSocket, "note");
            ConsoleWrite("note"&@CRLF);
 
        Case $Button2
            $ConnectedSocket = TCPConnect($clientIP, $nPort);
            TCPSend($ConnectedSocket, "calc");
            ConsoleWrite("calc"&@CRLF);
 
    EndSwitch
 
     sleep(2)
WEnd
cs

 

이번에는 반복문이다.

2번 줄이 TCP로 들어오는 것을 수신 역할 한다고 보면 될 것이다.

서버가 먼저 실행되고 클라이언트를 실행할 때 먼저 여기에서 클라이언트의 접속 상태를 수신하게 되어 있다. 이때 2번 줄에 해당(4 ~ 14번 줄) 항목이 먼저 처리한다. 오류가 없는지 이상유무도 함께 처리한다. 

반복문이기 때문에 수신되는 항목을 sleep(2)로 0.002초마다 처리한다고 보면 될 것 같다.

 

연결엔 문제가 없다면 수신 및 송신의 대기 상태로 있다가 GUI의 버튼에 의해 해당 원격으로 요청할 것을 전송하며 이상이 있을 경우 메시지로 오류 사항을 표시하고 반복문은 종료된다.

이 전송을 처리하는 것이 22~23번 줄이다. 위에서 설정한 클라이언트 IP주소로 송신한다.

 

그러면 다음으로 클라이언트 측 코드를 살펴보면 사실 통신을 주고받는 형태는 같으므로 다른 사항을 살펴보면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
TCPSend($ConnectedSocket, "Connection is alive..");
 
 
while 1
    $ConnectedSocket_Rev = TCPAccept($MainSocket);
 
    If  $ConnectedSocket_Rev <> -1 Then
        $recv = TCPRecv($ConnectedSocket_Rev, 2048);
 
        If $recv <> -1 Then
 
            if($recv == "note"Then
                Run("notepad.exe");
            ElseIf($recv == "calc"Then
                Run("calc.exe");
            ElseIf($recv == "exit"Then
                _Exit();
            EndIf
 
        EndIf
    EndIf
 
    sleep(2);
WEnd
cs

 

1번째 줄이 클라이언트가 실행될 때 연결 상태를 확인하고자 서버 측에 송신하는 내용이다. 서버에서 해당 내용을 수신하여 화면에 표시된다면 통신 송수신 상태가 잘 되었다는 것을 의미한다.

 

5~21번 줄이 수신되었을 때 null 값(autoit에서는 -1)이나 빈값이 아닐 경우 해당 내용을 처리한다.

서버로부터 수신된 값이 "note"나 "calc"이면 해당 run을 통해 소프트웨어를 실행한다.

 

대략적인 설명은 이쯤 해서 하고 잘 실행되는지 아래 영상을 확인해 보자.

확인은 데스크탑 PC와 노트북간에 내부 네트워크로 진행하였다. 그리고 실행하기에 앞서 서버와 클라이언트 간 IP 주소가 잘 맞는지 재확인하자.

 

음.. 잘되는군..

 

 

반응형

댓글