|
|
发表于 2025-10-28 09:59:47
|
显示全部楼层
江西省南昌市
using System;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;
namespace ProcessNetworkMonitor
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("进程网络连接监控程序");
Console.WriteLine("----------------------");
// 配置参数
string processName = "mir2.exe"; // 要监控的进程名
int checkInterval = 5000; // 检查间隔(毫秒)
int maxOfflineCount = 3; // 最大离线计数
int offlineCount = 0;
int processId = -1;
while (true)
{
try
{
// 查找目标进程
Process targetProcess = FindProcessByName(processName);
if (targetProcess == null)
{
Console.WriteLine($"[{DateTime.Now}] 未找到进程: {processName}");
offlineCount = 0;
processId = -1;
}
else
{
// 如果进程ID变化,重置计数器
if (processId != targetProcess.Id)
{
Console.WriteLine($"[{DateTime.Now}] 发现进程: {processName} (PID: {targetProcess.Id})");
offlineCount = 0;
processId = targetProcess.Id;
}
// 检查网络连接
bool hasNetworkActivity = CheckProcessNetworkActivity(targetProcess.Id);
if (hasNetworkActivity)
{
Console.WriteLine($"[{DateTime.Now}] 网络活动正常");
offlineCount = 0;
}
else
{
offlineCount++;
Console.WriteLine($"[{DateTime.Now}] 无网络活动 - 计数: {offlineCount}/{maxOfflineCount}");
if (offlineCount >= maxOfflineCount)
{
Console.WriteLine($"[{DateTime.Now}] !!!检测到掉线!!!");
// 这里可以添加掉线处理逻辑,如发送通知等
offlineCount = 0; // 重置计数器
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"[{DateTime.Now}] 监控出错: {ex.Message}");
}
Thread.Sleep(checkInterval);
}
}
static Process FindProcessByName(string name)
{
Process[] processes = Process.GetProcessesByName(name.Replace(".exe", ""));
return processes.Length > 0 ? processes[0] : null;
}
static bool CheckProcessNetworkActivity(int processId)
{
// 获取所有TCP连接
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
foreach (TcpConnectionInformation connection in connections)
{
if (connection.State == TcpState.Established)
{
// 检查是否有匹配的本地端口
if (IsPortOwnedByProcess(connection.LocalEndPoint.Port, processId))
{
return true;
}
}
}
// 检查UDP连接(可选)
IPEndPoint[] udpEndpoints = properties.GetActiveUdpListeners();
foreach (IPEndPoint endpoint in udpEndpoints)
{
if (IsPortOwnedByProcess(endpoint.Port, processId))
{
return true;
}
}
return false;
}
static bool IsPortOwnedByProcess(int port, int processId)
{
// 使用netstat命令查找端口对应的进程
// 这个方法更可靠,因为.NET API有时无法获取正确的进程ID
string command = $"netstat -ano | findstr :{port}";
Process cmdProcess = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/C {command}",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
cmdProcess.Start();
string output = cmdProcess.StandardOutput.ReadToEnd();
cmdProcess.WaitForExit();
return output.Contains($" {processId}");
}
}
} |
|