360安全卫士里面有个组件叫流量防火墙,感觉挺好用,但是不想安装360全家桶,于是自己捣鼓着用C#写一个比较简化的版本。

查看电脑上开启的TCP或UDP端口,可以用netstat命令,netstat用法如下:

显示协议统计和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval]

  -a            显示所有连接和侦听端口。
-b 显示在创建每个连接或侦听端口时涉及的可执行程序。
在某些情况下,已知可执行程序承载多个独立的
组件,这些情况下,显示创建连接或侦听端口时涉
及的组件序列。此情况下,可执行程序的名称
位于底部[]中,它调用的组件位于顶部,直至达
到 TCP/IP。注意,此选项可能很耗时,并且在您没有
足够权限时可能失败。
-e 显示以太网统计。此选项可以与 -s 选项结合使用。
-f 显示外部地址的完全限定域名(FQDN)。
-n 以数字形式显示地址和端口号。
-o 显示拥有的与每个连接关联的进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是下列任
何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选
项一起用来显示每个协议的统计,proto 可以是下列任
何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP
或 UDPv6。
-r 显示路由表。
-s 显示每个协议的统计。默认情况下,显示
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6
的统计;-p 选项可用于指定默认的子网。
-t 显示当前连接卸载状态。
interval 重新显示选定的统计,各个显示间暂停的间隔秒数。
按 CTRL+C 停止重新显示统计。如果省略,则 netstat
将打印当前的配置信息一次。

之前也有接触过netstat命令,因为开发的软件写死了端口,有时候开启失败,这时候会用netstat -ano|find "xxx"查看端口是否已经存在,得到对应的PID,再用这个PID去tasklist去查询程序名称。今日认真查看了netstat的用法才知道它就提供了查看对应程序名的参数,即 -b 参数。

不过需要注意的地方是加入-b参数后,得到的程序名和PID并不在同一行,而是在PID的下一行。而且有些系统级别的程序并不能获取到程序名。

以下是代码参考,一开始并不知道-b参数的存在,获取程序名用的是根据PID得到程序名的方法。netstat内部应该也是根据这个拿到程序名的。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.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions; namespace PortManage
{
public partial class Form1 : Form
{
const Int32 PROCESS_ALL_ACCESS = 0x1F0FFF;
const Int32 PROCESS_QUERY_INFORMATION = 0x00000400;
const Int32 PROCESS_VM_READ = 0x0010;
const Int32 PROCESS_VM_WRITE = 0x0020; [DllImport("Kernel32.dll", EntryPoint = "QueryFullProcessImageNameW", CharSet = CharSet.Auto)]
extern static Int32 QueryFullProcessImageNameW(Int32 hProcess, UInt32 flags, char[] nameList, ref UInt32 nameLen); [DllImport("kernel32.dll")]
public static extern Int32 OpenProcess(Int32 DesiredAccess, bool bInheritHandle, Int32 ProcessId); [DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(Int32 hObject); [DllImport("kernel32.dll")]
public static extern Int32 GetLastError(); public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
ShowInfo();
} private void ShowInfo()
{
List infoList = new List();
List nameList = new List();
System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();
System.Diagnostics.Process pro = new System.Diagnostics.Process();
pro.StartInfo.FileName = "cmd";
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.RedirectStandardInput = true;
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.CreateNoWindow = true;
pro.Start();
pro.StandardInput.WriteLine("netstat -anob");
pro.StandardInput.WriteLine("exit");
Regex reg = new Regex("\\s+", RegexOptions.Compiled);
string line = null;
infoList.Clear();
nameList.Clear();
while ((line = pro.StandardOutput.ReadLine()) != null)
{
line = line.Trim();
if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase))
{
line = reg.Replace(line, ",");
infoList.Add(line);
}
if (line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
{
line = reg.Replace(line, ",");
infoList.Add(line);
}
if (line.StartsWith("["))
{
line = line.Replace("[", "");
line = line.Replace("]", "");
nameList.Add(line);
}
else if (line.StartsWith("无法"))
{
nameList.Add("");
}
}
pro.Close();
for (int i = 0; i < infoList.Count; i++)
{
if (infoList[i].ToString().Split(',')[0] == "TCP")
{
ListViewItem listItem = new ListViewItem();
listItem.Text = infoList[i].ToString().Split(',')[0];
listItem.SubItems.Add(infoList[i].Split(',')[1]);
listItem.SubItems.Add(infoList[i].Split(',')[2]);
listItem.SubItems.Add(infoList[i].Split(',')[3]);
listItem.SubItems.Add(infoList[i].Split(',')[4]);
//int pid = Convert.ToInt32(infoList[i].Split(',')[4]);
//listItem.SubItems.Add(GetFullPathByPid(pid));
listItem.SubItems.Add(nameList[i]);
this.listView1.Items.Add(listItem);
}
else if (infoList[i].ToString().Split(',')[0] == "UDP")
{
ListViewItem listItem = new ListViewItem();
listItem.Text = infoList[i].ToString().Split(',')[0];
listItem.SubItems.Add(infoList[i].Split(',')[1]);
listItem.SubItems.Add(infoList[i].Split(',')[2]);
listItem.SubItems.Add("");
listItem.SubItems.Add(infoList[i].Split(',')[3]);
//int pid = Convert.ToInt32(infoList[i].Split(',')[3]);
//listItem.SubItems.Add(GetFullPathByPid(pid));
listItem.SubItems.Add(nameList[i]);
this.listView1.Items.Add(listItem);
}
}
} private string GetFullPathByPid(Int32 pid)
{
Int32 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, false, pid);
char[] buf = new char[512];
UInt32 len = 512;
QueryFullProcessImageNameW(hProcess, 0, buf, ref len);
CloseHandle(hProcess);
string nameList = new string(buf, 0, (int)len);
return nameList;
} private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 116)
{
listView1.Items.Clear();
ShowInfo();
}
}
}
}

效果图:

标签:
c#调用CMD、c#根据根据PID获取程序名

c#查看本机网络端口和对应的程序名的更多相关文章

  1. Mac升级后如何查看自己的网络端口

    OS X 10.9 下面 网络实用工具 从实用工具目录里消失了,可能这个程序用的人太少就取消了吧.但是对于做互联网的人还是有点用的. 参考http://www.mamicode.com/info-de ...

  2. netstat 查看本机开放端口

    root@kali:~# netstat -luntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Add ...

  3. linux下查看本机socket端口详细信息

    netstat -paut [root@OA-JRY-SY-FDEP1 nginx-]# netstat -paut Active Internet connections (servers and ...

  4. mac os x 查看网络端口情况

    查看端口是否打开 使用 netstat 命令 a. `netstat -nat | grep <端口号>` , 如命令 `netstat -nat | grep 3306` b. `net ...

  5. Windows查看网络端口被占用情况netstat命令

    在windows命令行窗口下执行: C:\>netstat -aon|findstr "80" TCP     127.0.0.1:80         0.0.0.0:0  ...

  6. Docker多机网络

    前言 前面的文章主要聚焦于单机网络上,对于生产环境而言,单机环境不满足高可用的特点,所以是不具备上生产的条件,因此在开始Docker Swarm篇的时候我们先来聊聊多机网络之间Docker的通信如何做 ...

  7. Linux netstat命令详解(检验本机各端口的网络连接情况)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...

  8. fuser - 查看文件/网络端口等被什么进程占用

    前提 linux环境下,当使用umount命令卸载挂载点时,会遇到“device is busy”提示,这时fuser就能查出谁在使用这个资源;当然umount –lf  [挂载点] 也可以强制卸载 ...

  9. Linux 查看网卡流量、网络端口

    查看网络流量 # 查看网卡流量 命令:sar -n DEV 1 10 注:每1秒 显示 1次 显示 10次 平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcm ...

随机推荐

  1. 使用jquery select2实现下拉框搜索功能

    由于公司后台系统下拉框数据量太多了,用户操作起来要不方便所以增加了下拉框里面一个搜索功能 1从官网下载jquery select2 下来 地址https://select2.github.io/ 2: ...

  2. web组件化开发第一天

    技术选型 html5 css3 jq 应用的插件 FullPage.js 一.建一个测试页面,测试静态的功能 <!DOCTYPE html> <html> <head&g ...

  3. JVM虚拟机内存溢出垃圾收集及类加载机制总结

    1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...

  4. Linux centosVMware shell中的函数、shell中的数组、

    一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...

  5. centos6.5安装图形操作界面

    yum -y install xorg-x11-fonts-Type1 #安装Xwindow yum -y groupinstall "X Window System" #安装GN ...

  6. 设计模式课程 设计模式精讲 8-8 单例设计模式-Enum枚举单例、原理源码解析以及反编译实战

    1 课堂解析 2 代码演练 2.1 枚举类单例解决序列化破坏demo 2.2 枚举类单例解决序列化破坏原理 2.3 枚举类单例解决反射攻击demo 2.4 枚举类单例解决反射攻击原理 3 jad的使用 ...

  7. 《React后台管理系统实战 :四》产品分类管理页:添加产品分类、修改(更新)产品分类

    一.静态页面 目录结构 F:\Test\react-demo\admin-client\src\pages\admin\category add-cate-form.jsx index.jsx ind ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:在元素获取焦点时显示(如:键盘操作的用户)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 图片IO域 旋转画面的组态 图片是4个静止的风扇 PLC的MW6为风扇指针..

    图片IO域 旋转画面的组态 图片是4个静止的风扇 PLC的MW6为风扇指针.. Plc在循环中断组织块 OB35 中 将MW6 每100ms 加1 加到4 清0 图片[MW6] MW6 是图片指针 对 ...

  10. P1002 A+B for Polynomials (25分)

    1002 A+B for Polynomials (25分)   This time, you are supposed to find A+B where A and B are two polyn ...