前言

准确的说,他是一个网络连接端口查看器,可以根据进程查端口,也可以根据端口查进程。期初是因在使用Fiddler的时候发现无法启动,提示端口被占用,但是由不知道用什么方法才能找到是哪个程序占用的Fiddler的端口,遂使用命令行的netstat命令配合find命令才找到,遂想写这样一个类似的工具帮助我们速度定位类似端口问题的所在。

PS:可预见很多人会说为什么不用360网络链接查看器,或是其他类似软件,功能更强大界面更美观巴拉巴拉…?

答:因为我喜欢bat批处理,我喜欢命令行,喜欢能用几句命令搞定的事就不用一个别的软件来搞,更重要的是享受编写代码这其中的过程。

使用方法

主要功能就两个:

1、查询某个进程都在使用哪些端口号,包含同进程名的所有实例,以及他们分别所占用的TCP和UDP端口。

2、查看某个端口被哪个进程使用,包括远程IP和本地IP,以及TCP和UDP的所有端口

如何看懂显示列表

程序界面:

本程序返回值使用的windows命令行下的netstat命令。

什么是netstat命令?

Netstat,在Internet RFC标准中,Netstat的定义是: Netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

具体的关于netstat命令的用法可以参见:netstat百度百科WIKI如何用netstat命令查看端口占用问题

什么是PID?

PID(ProcessID)操作系统里指进程ID号。操作系统里每打开一个程序都会创建一个进程ID,即PID。
PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。
PID一列代表了各进程的进程ID,也就是说,PID就是各进程的身份标识。

“状态”字段有哪些类型及含义?

连接状态。在原模式中没有状态,在用户数据报协议中也经常没有状态,于是状态列可以空出来。若有状态,通常取值为:
LISTEN
侦听来自远方的TCP端口的连接请求
SYN-SENT
在发送连接请求后等待匹配的连接请求
SYN-RECEIVED
在收到和发送一个连接请求后等待对方对连接请求的确
ESTABLISHED
代表一个打开的连接
FIN-WAIT-1
等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2
从远程TCP等待连接中断请求
CLOSE-WAIT
等待从本地用户发来的连接中断请求
CLOSING
等待远程TCP对连接中断的确认
LAST-ACK
等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT
等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED
没有任何连接状态

什么是本地地址,外部地址?

简单的讲,本地地址即当前这个链接到你本机通信的IP地址和端口,外部地址即当前这个链接到的远程服务器地址和端口。

当然本地和外部地址都有可能是本地地址,一般端口不一样而已。一个典型的应用就是代理服务软件

具体的可以参见:端口百科 中相关地址的解释,或是参见:NAT概念中的四类地址概念,也有助于理解。

查询某进程占用的端口号

这里我们查询Fiddler.exe所占用的端口号,在主界面选择1,回车。再输入Fiddler回车

可以看到红框内,Fiddler占用了本地IPv4和IPv6的8888端口,并且一直处于监听(LISTENING)状态。

注意:最后一行的[::]表示IPv6的所有地址,等同于IPv4的0.0.0.0地址

此地址在不同环境有不同名称,若在路由表中他表示默认路由。在网络编程中,若监听此地址的端口,则可相当于同时监听本地回环地址127.0.0.1以及localhost地址以及本机所有网卡的本地地址(如192.168.1.100)的端口。

反之,若只监听当前网卡本地地址192.168.1.100的端口,则使用127.0.0.1地址就访问不到

关于什么是0.0.0.0地址可以参考:WIKI这里

关于0.0.0.0和127.0.0.1的区别可以参考:红黑文库stackoverflow,以及 知乎的讨论

好了扯远了,继续说bat用法,看到本地全零地址,以及监听状态,就可以判断此程序Fiddler在占用8888端口,此时若有其他程序如IIS,汤姆猫之类的程序要启动同端口就会报错了。

再看看QQ的占用情况:

可以看到当前有两个进程叫QQ.exe,他们的分别的链接情况及TCP、UDP链接如图所示。

查询某端口被哪个进程所占用

这里我们依旧测试Fiddler的8888端口,这里输入2回车,输入端口号8888回车,查看结果:

可以看到8888端口在IPv4和IPv6上都由Fiddler.exe在占用(监听)

帮助信息:

注意:若无法使用或查询无响应,请使用管理员权限启用本批处理,方法可以参照我之前写的文章:如何创建管理员权限的CMD命令提示符窗口

程序源码下载

源码已经托管至Github:

https://github.com/xxcanghai/cnblogsFiles/blob/master/NetstatFilter网络连接查看器.bat

或是直接复制下述所有代码保存到.bat文件后,直接运行即可。

批处理代码:

::NetstatFilter网络连接查看器 @小小沧海 xxcanghai.cnblogs.com By:2015年6月29日
@echo off
:start
title NetstatFilter By:xxcanghai
SETLOCAL ENABLEEXTENSIONS&SETLOCAL ENABLEDELAYEDEXPANSION
cls ::######config######
set PCENAME=
set PID=
set PORT= ::inner config
set ERRORCODE=0 :menu
cls&echo ----------NetstatFilter----------
echo [1]查询指定进程名使用的端口号
echo [2]查看指定端口被哪个进程使用
echo [3]帮助信息
echo.
set /p=请输入对应数字:<nul
set select=3&set /p select=
if /i "%select%"=="q" exit /b
if /i "%select%"=="exit" exit /b
if "%select%"=="1" goto :menuitem1
if "%select%"=="2" goto :menuitem2
if "%select%"=="3" goto :help
cls&goto :menu :menuitem1
set /p=请输入要查询的进程名称:<nul
set PCENAME=&set /p PCENAME=
if /i "%PCENAME%"=="q" goto :menu
if "%PCENAME%"=="" goto :menuitem1
if "%PCENAME:.=%"=="%PCENAME%" set PCENAME=%PCENAME%.exe
call :getpid "%PCENAME%" PID
echo Process:%PCENAME%,PID:%PID%
call :getnetbypid "%PID%"
echo @1END&pause>nul&goto start :menuitem2
set /p=请输入要查询的端口号:<nul
set PORT=&set/p PORT=
if /i "%PORT%"=="q" goto :menu
if "%PORT%"=="" goto :menuitem2
call :getnetbyport "%PORT%"
echo @2END&pause>nul&goto start :help
cls
echo ┏━━━━━━━━━━━━━━NetstatFilter ━━━━━━━━━━━━━━━━┓
echo ┃ netstat命令的辅助工具 @小小沧海 xxcanghai.cnblogs.com ┃
echo ┃ ┃
echo ┃1.可查询某个进程在使用哪些端口,包含同名进程的多个实例及所有TCP和UDP端口 ┃
echo ┃2.可查询指定端口正在被哪些进程使用,以及本地/远程IP端口和当前连接状态 ┃
echo ┃ =注意= ┃
echo ┃※1.若无法使用或查询无反应请用管理员权限执行本批处理,方法参照上述博客文章┃
echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ echo 按任意键返回主菜单&pause>nul&goto start ::#####get pid by process#####
::[tasklist] example
::cmd.exe 11132 Console 1 3,000 K
::cmd.exe 8204 Console 1 2,728 K
::cmd.exe 10060 Console 1 2,996 K
:getpid
if not "%~1"=="" (
set PID=
for /f "tokens=2 delims= " %%i in ('tasklist /fi "imagename eq %~1" /nh /fo table^|find /i "%~1"') do (
set PID=!PID!%%i,
)
if "!PID!"=="" (
set ERRORCODE=101
echo [ERROR]ProcessName "%~1" is not found
pause>nul&goto start
) else (
set PID=!PID:~0,-1!
)
set %2=!PID!
goto :eof
) ::#####get netstat by pid#####
::[netstat] example:
:: Proto Local Address Foreign Address State PID
:: TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
:: UDP [::1]:50575 *:* 5108
:getnetbypid
if not "%~1"=="" (
set PID=%~1
for /f "tokens=1,* delims=," %%a in ("!PID!") do (
set subpid=%%a
set PID=%%b
::get TCP
echo [PID-!subpid!]:
for /f "delims=" %%z in ('netstat -a -n -o^|find ":"') do (
set tLine=%%z
::netstat的IPv6结果中含有%符号,%符号在call传递中会发生错误,遂将%替换为$后再传递
set tLine=!tLine:%%=$!
call :getNetInfo "!tLine!" tProto tLocalAdd tForeignAdd tState tPID
set tLine=!tLine:$=%%!
::call使用完成后将$符号替换回%符号
if "!tPID!"=="!subpid!" (
echo !tLine!
)
)
)
if not "!PID!"=="" (call %0 "!PID!")
goto :eof
) ::#####get netstat by port#####
:getnetbyport
if not "%~1"=="" (
set PORT=%~1
for /f "tokens=1,* delims=," %%a in ("!PORT!") do (
set myport=%%a
set PORT=%%b
::PORT==8888
for /f "delims=" %%z in ('netstat -a -n -o^|find /i ":!myport! "') do (
set tLine=%%z
set tLine=!tLine:%%=$!
call :getNetInfo "!tLine!" tProto tLocalAdd tForeignAdd tState tPID
set tLine=!tLine:$=%%!
echo !tLine!
for /f "tokens=1 delims= " %%j in ('tasklist /nh /fi "PID eq !tPID!"') do (
echo [%%j]
)
)
)
)
goto :eof echo END.&pause>nul&goto start
exit ::#####FUNCTION#####
:getNetInfo
::将netstat -ano的某一行分隔成不同的变量
::call :getNetInfo "<netstat output line>" tProto tLocalAdd tForeignAdd tState tPID
if not "%~1"=="" (
for /f "tokens=1,2,3,4,5 delims= " %%i in ("%~1") do (
set %2=%%i
set %3=%%j
set %4=%%k
if "%%i"=="TCP" (
set %5=%%l
set %6=%%m
) else (
set %5=
set %6=%%l
)
)
)
goto :eof ::#####FUNCTION#####
:split
::%0为函数名称自身:split,%1为传过来的值,%~1为删除变量中的双引号"
::在此子搜索函数中把过滤器按照/符号分割开,并取得分割后的第一个的值
::再把分割后的剩下的值重赋予过滤器,并调用自身,直到过滤器为空为止,返回
set subf=%~1
for /f "tokens=1,* delims=," %%j in ("%subf%") do ( set subf=%%k
)
if not "!subf!"=="" (call %0 "!subf!")
goto :eof ::#####FUNCTION#####
:FUN1 goto :eof
原文地址-小小沧海:http://www.cnblogs.com/xxcanghai/p/4958577.html

[批处理]NetstatFilter快速查找端口被占用问题的更多相关文章

  1. xampp的Apache服务无法启动 Apache的443端口被占用解决方法

    今天在使用本地的XAMPP的时候,发现Apache服务不能正常启动,根据以往的经验,可能是80端口或者443端口被占用导致的,所以对端口占用情况进行排查. 1. 执行xampp/apache/bin中 ...

  2. windows查找端口占用/ 终结端口占用 ------------windows小技巧

    前沿 我是一名小程序员,经常通过一些类似tomcat,jettry 等服务器工具 调试项目.有时候莫名其妙的就会出现 程序关闭不正常的情况!去查端口又死活找不到!最后只能重启电脑 后面,在网上查了一些 ...

  3. cmd查找端口占用情况

    查找端口占用情况:netstat -ano|findstr 4848 查看使用指定端口的应用程序:tasklist|findstr xxxx,xxxx指的是pid 结束指定进程:taskkill /p ...

  4. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令   1.列出所有端口的情 ...

  5. JN_0016:查找端口占用

    Windows查看端口占用   一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano 可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会 ...

  6. window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题

    1.应用场景 在Windows或者linux操作系统中,我们在启动一个tomcat服务器时,经常会发现8080端口已经被占用的错误,而我们又不知道如何停止这个tomcat服务器. 2.window环境 ...

  7. xampp 80端口被占用解决办法

    很多朋友安装xampp之后,启用服务器或者数据库失败,发现端口已经被占用.因为每台电脑占用端口的软件不一样,要如何解决这个问题. 第一种解决方法: 检查软件安装路径中是否有中文,如下图: 解决方法: ...

  8. Linux下端口被占用解决

      有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln netstat -tln | ...

  9. windows系统查看80端口被占用的程序并结束该程序运行

    一.背景 最近系统更新以后,我在Idea中适用80端口启动项目的时候发现80端口被占用了,就查了资料看怎么找到占用80端口的程序并结束其运行,下面把解决方式共享给大家. 二.解决步骤 1.首先打开控制 ...

随机推荐

  1. Jscript运行时错误:没有权限

    问题:我在页面A中放了一个iframe ,然后在iframe 的子页面中调用主页面中的JavaScript函数,结果报错Jscript运行时错误:没有权限 原因有2: 1. 是逻辑错误,比如先关闭了i ...

  2. Mybatis的WHERE和IF动态

    mapper.xml: <!--查询套餐产品 --> <select id="queryComboProducts" resultType="com.r ...

  3. win安装mysql

    在这讲解的是有关于通过zip解压安装MySQL的方法.有看了网上的其它的教程,讲的有些不够完善,也自己写一篇简述一下.个人还是建议看官方的参考文档非常之详细:https://dev.mysql.com ...

  4. HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版

    题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...

  5. PAT 1088 Rational Arithmetic[模拟分数的加减乘除][难]

    1088 Rational Arithmetic(20 分) For two rational numbers, your task is to implement the basic arithme ...

  6. 解决maven的依赖总是无法下载完成

    有时候在eclipse里面刚刚导进一个maven项目,但是总是无法完整下载pom文件里面的依赖 主要有两个原因: 1,需要下载的依赖(jar包)需要开发人员给权限(远程仓库的下载权限),这个可以找开发 ...

  7. 2017 ACM/ICPC Asia Regional Qingdao Online Solution

    A : Apple 题意:给出三个点,以及另一个点,求最后一个点是否在三个点的外接圆里面,如果在或者在边界上,输出“Rejected”,否则输出"Accepted" 思路:先求一个 ...

  8. 在Linux系统下统计当前文件夹下的文件个数、目录个数

    1.统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 如下图: 2.统计文件夹下目录的个数,包括子文件夹里的 ls -lR|grep &q ...

  9. react 修改循环列表的当前单个子项状态:思路 拿原始state数据更改,再做请求

    handleLike(item,index){ var id = item.id; _ENV.post( _ENV.HOST+'/communion/video-up', {'user_id':loc ...

  10. c++第三十天

    P154~p159:语句1.通常情况下顺序执行. 2.C++提供一组控制流(flow-of-control)语句以支持更复杂的执行路径. 3.空语句的作用:语法上需要一条语句,但是逻辑上不需要. ) ...