这段代码是什么含义

qin1826681768 2012-04-27 04:10:00
哪位大侠给解释解释这段代码的含义,最好详细一些。谢谢各位

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;
using System.Management;

namespace eKanBanClient
{
public partial class FrmClient : Form
{
private const int UdpPort = 8002;
private const int TcpPort = 8004;
private const string fgf = "|";
private UdpClient listener = new UdpClient(UdpPort);
private bool isClose = false;
private TcpClient tcpClient;
private TcpListener tcpListener;
private string macAddress;
private string ipAddress;

public FrmClient()
{
InitializeComponent();
notifyIcon1.Icon = this.Icon;
notifyIcon1.Text = this.Text;

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
foreach (ManagementObject mo in moc2)
{
if ((bool)mo["IPEnabled"] == true)
macAddress = mo["MacAddress"].ToString();
mo.Dispose();
}

foreach (IPAddress ip in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (ip.ToString().Length > 7)
{
ipAddress = ip.ToString();
}
}


tcpListener = new TcpListener(Dns.GetHostAddresses(Dns.GetHostName())[0], TcpPort);
tcpListener.Start();
backgroundWorkerTcp.RunWorkerAsync();
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}

[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int DoFlag, int rea);

internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
internal const int EWX_FORCEIFHUNG = 0x00000010;

private static void DoExitWin(int DoFlag)
{
bool ok;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
ok = ExitWindowsEx(DoFlag, 0);
}

public static void Reboot()
{
DoExitWin(EWX_FORCE | EWX_REBOOT);
}

public static void PowerOff()
{
DoExitWin(EWX_FORCE | EWX_POWEROFF);
}

public static void LogoOff()
{
DoExitWin(EWX_FORCE | EWX_LOGOFF);
}

private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
}

private void StartListener()
{
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 0);

try
{
while (true)
{

byte[] bytes = listener.Receive(ref groupEP);
string message = Encoding.Unicode.GetString(bytes, 0, bytes.Length);
backgroundWorker.ReportProgress(bytes.Length, message);

try
{

string serverIp = message.Substring(0, message.IndexOf(fgf));
int tcpPort = Convert.ToInt32(message.Substring(message.IndexOf(fgf) + 1, message.Length - message.IndexOf(fgf) - 1));
tcpClient = new TcpClient(serverIp, tcpPort);

NetworkStream ns = tcpClient.GetStream();
byte[] data = Encoding.Unicode.GetBytes(Dns.GetHostName() + fgf + ipAddress + fgf + macAddress);
ns.Write(data, 0, data.Length);
ns.Close();
tcpClient.Close();
backgroundWorker.ReportProgress(0, Encoding.Unicode.GetString(data));
}
catch (Exception ex)
{
backgroundWorker.ReportProgress(0, "Error:" + ex.Message);
}
}
}
catch (Exception e)
{
backgroundWorker.ReportProgress(0, "Error:" + e.Message);
}

}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
StartListener();
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBoxMessage.Items.Add(e.UserState.ToString() + " Time:" + DateTime.Now.ToShortTimeString());
}

private void FrmClient_FormClosing(object sender, FormClosingEventArgs e)
{
if (!isClose)
{
e.Cancel = true;
this.Hide();
}
else
{
backgroundWorker.CancelAsync();
backgroundWorkerTcp.CancelAsync();
listener.Close();
tcpListener.Stop();
}
}

private void 显示ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Show();
}

private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
isClose = true;
this.Close();
}

private void FrmClient_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Close();
}
}

//接收远程控制包
private void backgroundWorkerTcp_DoWork(object sender, DoWorkEventArgs e)
{
try
{
while (true)
{
Byte[] bytes = new Byte[1024];
TcpClient client = tcpListener.AcceptTcpClient();
NetworkStream stream = client.GetStream();

do
{
stream.Read(bytes, 0, bytes.Length);
}
while (stream.DataAvailable);

ExecCommand(Encoding.Unicode.GetString(bytes, 0, bytes.Length).Replace("\0", "").Trim());
stream.Close();
client.Close();
}
}
catch (Exception ex)
{
backgroundWorkerTcp.ReportProgress(0, "Error:" + ex.Message);
}
}

private void ExecCommand(string command)
{
if (command == "Reboot")
{
Reboot();
//backgroundWorkerTcp.ReportProgress(0, command);
}
else if (command == "PowerOff")
{
PowerOff();
//backgroundWorkerTcp.ReportProgress(0, command);
}
else if (command == "LogoOff")
{
LogoOff();
//backgroundWorkerTcp.ReportProgress(0, command);
}
else
{
MessageBox.Show(command);
}
}

private void backgroundWorkerTcp_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBoxMessage.Items.Add(e.UserState.ToString() + " Time:" + DateTime.Now.ToShortTimeString());
}

private void listBoxMessage_SelectedIndexChanged(object sender, EventArgs e)
{

}
}
}
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WAN 2012-04-27
  • 打赏
  • 举报
回复
是一个实现远程操控的服务端代码。开启监听,给客户端发送主机名,IP地址和MAC地址,还有就是接受远端指令,实现受控的关机、重启、注销
大概写一下,细处略过

private const int UdpPort = 8002; //本机UDP监听端口
private const int TcpPort = 8004; //本机TCP监听端口
...
private UdpClient listener = new UdpClient(UdpPort); //用于UDP监听
...
//使用WMI获取本机网卡MAC地址
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
...

//获取本机IP地址
foreach (IPAddress ip in Dns.GetHostAddresses(Dns.GetHostName()))
...

//开启TCP监听
tcpListener = new TcpListener(Dns.GetHostAddresses(Dns.GetHostName())[0], TcpPort);
...
...
//包括一大段的DllImport代码用于实现计算机的关机、重启、注销(调用API是因为Win2000以上关机,程序要先获取相应特权)
private static void DoExitWin(int DoFlag)

...
//UDP监听
private void StartListener()
//读取所有UDP数据包
byte[] bytes = listener.Receive(ref groupEP);
...
//根据读取到的IP和端口信息新建TcpClient,用以将本机的主机名,IP地址和MAC地址发送给远端
tcpClient = new TcpClient(serverIp, tcpPort);
...
...
//TCP监听,接收远程控制包
private void backgroundWorkerTcp_DoWork(object sender, DoWorkEventArgs e)
...
//接受远端指令,实现受控的关机、重启、注销
ExecCommand(Encoding.Unicode.GetString(bytes, 0, bytes.Length).Replace("\0", "").Trim());
evelyn_green 2012-04-27
  • 打赏
  • 举报
回复
tcp通讯+PINVOKE;
有没进程通讯
avi9111 2012-04-27
  • 打赏
  • 举报
回复
楼上说的都对。

能跑起来么?自己debug一下咯,实践出真知
EnForGrass 2012-04-27
  • 打赏
  • 举报
回复
调用系统API函数,进行远程控制,比如查看进程、获取进程优先级、关机、重启什么的
ztenv 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
像是远程控制,想明白怎么回事,自己放到程序里运行跟踪,对着各个函数的帮助
[/Quote]

毫无重点,说说人哪些不明白吧。
threenewbee 2012-04-27
  • 打赏
  • 举报
回复
调用了一些api函数。比如关闭程序、关机。
bdmh 2012-04-27
  • 打赏
  • 举报
回复
像是远程控制,想明白怎么回事,自己放到程序里运行跟踪,对着各个函数的帮助

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧