원격 제어 프로그램 10. 원격 제어 이벤트 전송 클라이언트

이제 원격 제어 컨트롤러에서 발생하는 키보드와 마우스 이벤트를 전송하는 SendEventClient 클래스를 구현합시다.

전송하고 수신할 메시지 종류를 열거형으로 정의합시다.

public enum MsgType//원격 제어 이벤트 종류
{
    MT_KDOWN = 1, MT_KEYUP, MT_M_LEFTDOWN,
    MT_M_LEFTUP, MT_M_RIGHTUP, MT_M_RIGHTDOWN,
    MT_M_MIDDLEDOWN, MT_M_MIDDLEUP, MT_M_MOVE
}

이벤트를 전송하는 SendEventClient를 작성합시다.

public class SendEventClient
{

원격 제어 호스트의 IP 단말을 멤버 필드로 선언하세요.

    IPEndPoint ep;

생성자에서는 상대측 IP와 포트를 입력인자로 받아서 IPEndPoint 개체를 생성합니다.

    public SendEventClient(string ip, int port)
    {
        //원격 제어 호스트 IP 단말 개체 생성
        ep = new IPEndPoint(IPAddress.Parse(ip), port);
    }

키를 누른 메시지를 전송하는 메서드를 구현합시다.

    public void SendKeyDown(int key)
    {

이 프로그램에서 키보드와 마우스 이벤트 정보 중에 제일 큰 크기는 마우스 이동 이벤트입니다. 이벤트 종류 1바이트, x좌표 4바이트, y좌표 4바이트로 총 9바이트가 필요합니다.

여기에서는 고정 길이로 보낼 것이어서 9바이트의 버퍼를 생성합니다.

        byte[] data = new byte[9];

맨 처음 바이트는 이벤트 종류입니다. 여기에서는 키 누름 이벤트로 설정합니다.

        data[0] = (byte)MsgType.MT_KDOWN;//키 누름 이벤트 설정

누른 키를 버퍼에 복사하세요.

        Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4);//누른 키를 버퍼에 복사

그리고 버퍼를 전송하세요.

        SendData(data);//버퍼 전송
    }

이벤트 버퍼를 전송하는 SendData 메서드를 구현합시다.

    private void SendData(byte[] data)
    {

소켓을 생성하세요.

        //소켓 생성
        Socket sock = new Socket(AddressFamily.InterNetwork, 
                                 SocketType.Stream, 
                                 ProtocolType.Tcp);

원격 제어 호스트와 연결하세요.

        sock.Connect(ep);//원격 제어 호스트에 연결

이벤트 버퍼를 전송합니다.

        sock.Send(data); //이벤트 전송

전송 후에 소켓을 닫습니다.

        sock.Close(); //소켓 닫기

    }

이 프로그램에서는 키보드와 마우스 이벤트가 발생할 때마다 원격 제어 호스트의 이벤트 수신 서버에 연결하여 전송하고 닫는 것을 반복할 거예요.

키를 떼었을 때 이벤트를 전송하는 SendKeyUp 메서드를 구현합시다.

    public void SendKeyUp(int key)
    {

메시지를 보낼 버퍼를 생성하세요.

        byte[] data = new byte[9];

키를 뗌 이벤트를 설정하세요.

        data[0] = (byte)MsgType.MT_KEYUP;//키 뗌 이벤트 설정

어느 키를 뗀 것인지 버퍼에 복사하세요.

        Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4); //뗀 키를 버퍼에 복사

버퍼를 전송합니다.

        SendData(data);//버퍼 전송
    }

마우스 누름 이벤트를 전송하는 SendMouseDown 메서드를 구현합시다.

    public void SendMouseDown(MouseButtons mouseButtons)
    {

메시지를 보낼 버퍼를 생성하세요.

        byte[] data = new byte[9];

마우스 버튼에 따라 메시지 종류를 결정하세요.

        switch (mouseButtons)//마우스 버튼에 따라 메시지 종류 결정
        {
            case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTDOWN; break;
            case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTDOWN; break;
            case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEDOWN; break;
        }

메시지를 전송합니다.

        SendData(data);//마우스 누름 이벤트 전송
    }

마우스 뗌 이벤트를 전송하는 SendMouseUp 메서드를 구현합시다.

    public void SendMouseUp(MouseButtons mouseButtons)
    {

메시지를 보낼 버퍼를 생성하세요.

        byte[] data = new byte[9];

마우스 버튼에 따라 메시지 종류를 결정하세요.

        switch (mouseButtons) //마우스 버튼에 따라 메시지 종류 결정
        {
            case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTUP; break;
            case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTUP; break;
            case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEUP; break;
        }

메시지를 전송합니다.

        SendData(data);//마우스 뗌 이벤트 전송
    }

마우스 이동 이벤트를 전송하는 SendMouseMove 메서드를 구현합시다.

    public void SendMouseMove(int x, int y)
    {

메시지를 보낼 버퍼를 생성하세요.

        byte[] data = new byte[9];

마우스 이동 이벤트를 설정하세요.

        data[0] = (byte)MsgType.MT_M_MOVE;//마우스 이동 이벤트 설정

마우스의 x, y 좌표를 복사하세요.

        Array.Copy(BitConverter.GetBytes(x), 0, data, 1, 4); //x좌표 복사
        Array.Copy(BitConverter.GetBytes(y), 0, data, 5, 4); //y좌표 복사

메시지를 전송합니다.

        SendData(data); //마우스 이동 이벤트 전송
    }
}

다음은 이번 실습에서 작성한 소스 코드입니다.

//SendEventClient.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;

namespace 원격제어기
{
    /// <summary>
    /// 원격 제어 이벤트 종류 열거형
    /// </summary>
    public enum MsgType
    {
        MT_KDOWN = 1, MT_KEYUP, MT_M_LEFTDOWN,
        MT_M_LEFTUP, MT_M_RIGHTUP, MT_M_RIGHTDOWN,
        MT_M_MIDDLEDOWN, MT_M_MIDDLEUP, MT_M_MOVE
    }

    /// <summary>
    /// 원격 제어 이벤트 전송 클라이언트 클래스
    /// </summary>
    public class SendEventClient
    {
        IPEndPoint ep;

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="ip">원격지 호스트 IP</param>
        /// <param name="port">포트</param>
        public SendEventClient(string ip, int port)
        {
            //원격 제어 호스트 IP 단말 개체 생성
            ep = new IPEndPoint(IPAddress.Parse(ip), port);
        }

        /// <summary>
        /// 키 누름 이벤트 전송 메서드
        /// </summary>
        /// <param name="key">누른 키</param>
        public void SendKeyDown(int key)
        {
            byte[] data = new byte[9];
            data[0] = (byte)MsgType.MT_KDOWN;//키 누름 이벤트 설정
            Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4);//누른 키를 버퍼에 복사
            SendData(data);//버퍼 전송
        }

        private void SendData(byte[] data)
        {
            //소켓 생성
            Socket sock = new Socket(AddressFamily.InterNetwork, 
                                     SocketType.Stream, 
                                     ProtocolType.Tcp);
            sock.Connect(ep);//원격 제어 호스트에 연결
            sock.Send(data); //이벤트 전송
            sock.Close(); //소켓 닫기
        }

        /// <summary>
        /// 키 뗌 이벤트 전송 메서드
        /// </summary>
        /// <param name="key">뗀 키</param>
        public void SendKeyUp(int key)
        {
            byte[] data = new byte[9];
            data[0] = (byte)MsgType.MT_KEYUP;//키 뗌 이벤트 설정
            Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4); //뗀 키를 버퍼에 복사
            SendData(data);//버퍼 전송
        }

        /// <summary>
        /// 마우스 누름 이벤트 전송 메서드
        /// </summary>
        /// <param name="mouseButtons">누른 마우스 버튼</param>
        public void SendMouseDown(MouseButtons mouseButtons)
        {
            byte[] data = new byte[9];
            switch (mouseButtons)//마우스 버튼에 따라 메시지 종류 결정
            {
                case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTDOWN; break;
                case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTDOWN; break;
                case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEDOWN; break;
            }
            SendData(data);//마우스 누름 이벤트 전송
        }

        /// <summary>
        /// 마우스 뗌 이벤트 전송 메서드
        /// </summary>
        /// <param name="mouseButtons">뗀 마우스 버튼</param>
        public void SendMouseUp(MouseButtons mouseButtons)
        {
            byte[] data = new byte[9];
            switch (mouseButtons) //마우스 버튼에 따라 메시지 종류 결정
            {
                case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTUP; break;
                case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTUP; break;
                case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEUP; break;
            }
            SendData(data);//마우스 뗌 이벤트 전송
        }

        /// <summary>
        /// 마우스 이동 메서드
        /// </summary>
        /// <param name="x">마우스 x좌표</param>
        /// <param name="y">마우스 y좌표</param>
        public void SendMouseMove(int x, int y)
        {
            byte[] data = new byte[9];
            data[0] = (byte)MsgType.MT_M_MOVE;//마우스 이동 이벤트 설정
            Array.Copy(BitConverter.GetBytes(x), 0, data, 1, 4); //x좌표 복사
            Array.Copy(BitConverter.GetBytes(y), 0, data, 5, 4); //y좌표 복사
            SendData(data); //마우스 이동 이벤트 전송
        }
    }
}