이제 원격 제어 컨트롤러에서 발생하는 키보드와 마우스 이벤트를 전송하는 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); //마우스 이동 이벤트 전송 } } }