116 lines
4.8 KiB
C#
116 lines
4.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace ControlAgent
|
|
{
|
|
public partial class Form1 : Form
|
|
{
|
|
private bool _isAgentRunning = true;
|
|
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
|
|
// 백그라운드 태스크 형태로 서버 감지 및 수신 스레드 기동 (UI 먹통 현상 방지)
|
|
Task.Run(() => StartAgentTask());
|
|
}
|
|
|
|
private void StartAgentTask()
|
|
{
|
|
while (_isAgentRunning)
|
|
{
|
|
try
|
|
{
|
|
using (TcpClient client = new TcpClient())
|
|
{
|
|
var result = client.BeginConnect("192.168.219.47", 9999, null, null);
|
|
bool success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5));
|
|
|
|
if (success)
|
|
{
|
|
client.EndConnect(result);
|
|
using (NetworkStream stream = client.GetStream())
|
|
using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8))
|
|
{
|
|
// 1. 연결되자마자 MAC 주소 송신
|
|
string myMac = GetMacAddress() + "\n";
|
|
byte[] macBytes = Encoding.UTF8.GetBytes(myMac);
|
|
stream.Write(macBytes, 0, macBytes.Length);
|
|
stream.Flush();
|
|
|
|
// 2. 서버로부터 명령/데이터 대기 (ReadLine 사용으로 안정성 확보)
|
|
while (client.Connected)
|
|
{
|
|
string command = reader.ReadLine(); // 데이터가 들어올 때까지 여기서 대기
|
|
if (string.IsNullOrEmpty(command)) break; // 연결이 끊기면 루프 탈출
|
|
// 명령 처리
|
|
// 에이전트 코드의 command == "STOP" 내부를 수정
|
|
if (command == "STOP")
|
|
{
|
|
// /f 옵션(강제 종료)과 /t 0(즉시)을 추가하고 절대 경로로 실행
|
|
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
|
|
psi.FileName = "cmd.exe";
|
|
psi.Arguments = "/c shutdown /s /f /t 0"; // /f가 강제 종료 옵션입니다.
|
|
psi.CreateNoWindow = true;
|
|
psi.UseShellExecute = false;
|
|
|
|
System.Diagnostics.Process.Start(psi);
|
|
|
|
_isAgentRunning = false;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// 데이터 전송 테스트 수신 시 처리
|
|
MessageBox.Show("서버 메시지 수신: " + command);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("에이전트 루프 오류: " + ex.Message);
|
|
}
|
|
|
|
if (_isAgentRunning) Thread.Sleep(5000); // 5초 대기 후 재연결
|
|
}
|
|
}
|
|
|
|
// MAC 물리 주소 자동 추출 내부 함수
|
|
public string GetMacAddress()
|
|
{
|
|
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
|
|
{
|
|
// 가상 장치 필터링 및 오프라인 장치 필터링 수행
|
|
if (ni.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
|
|
ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel &&
|
|
ni.OperationalStatus == OperationalStatus.Up)
|
|
{
|
|
string mac = ni.GetPhysicalAddress().ToString();
|
|
if (!string.IsNullOrEmpty(mac))
|
|
{
|
|
return mac; // 수집 완료
|
|
}
|
|
}
|
|
}
|
|
return "MAC Not Found";
|
|
}
|
|
|
|
public string GetMyInfo()
|
|
{
|
|
string pcName = Environment.MachineName;
|
|
string mac = GetMacAddress();
|
|
return $"{pcName}|{mac}";
|
|
}
|
|
}
|
|
} |