没有合适的资源?快使用搜索试试~ 我知道了~
端口占用问题的解决方法汇总
5星 · 超过95%的资源 需积分: 50 12 下载量 44 浏览量
2012-04-04
10:33:29
上传
评论 1
收藏 17KB TXT 举报
温馨提示
试读
31页
经常会遇到一些占有端口的程序突然死掉的情况(特别是tomcat之类),由于程序是异常结束,占用的端口没有及时释放,这时重新再启动程序的话会报端口被占用的异常,无法正常使用,这时候就需要强制的释放这个端口。 。。。。。。。。。。
资源推荐
资源详情
资源评论
经常会遇到一些占有端口的程序突然死掉的情况(特别是tomcat之类),由于程序是异常结束,占用的端口没有及时释放,这时重新再启动程序的话会报端口被占用的异常,无法正常使用,这时候就需要强制的释放这个端口。具体操作如下:
1、得到占用端口的PID。打开CMD, 命令:netstat -a -o 。
2、强行释放。命令:ntsd -c q -p PID
自己解决了,绑定之前加一个,重用端口
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1))
一拿到Fport的时候,我就对它进行了API分析,发现除了一些基本的API以外,它还调用了NTDLL.dll的几个未公开API,如NtQuerySystemInfomation,NtQueryInfomationProcess,直觉告诉我,关键应该在这两个函数中,特别是前者。为了能够理解Fport的运行机理,我们首先要来复习一下SOCKET。SOCKET究竟是什么?它的中文名称叫做套接口,但是,实际上我们所谓的SOCKET数据结构只是一个32位的无符号整数(在UNIX中是16位的),它对于Windows操作系统来说其实是一个文件句柄(SOCKET是文件?奇怪么?操作系统在底层实现的时候,常常使用文件的概念来完成一些基本的功能),这样的话问题就明朗了,如果我们能够枚举系统所有的句柄,从中获得属性为SOCKET的,不就可以完成Fport的功能?现在你应该想到了,为什么Fport要调用NtQuerySystemInfomation这个API,实际上,NtQuerySystemInfomation这个函数提供了一个简单的途径以获得系统所有的HANDLE,我们先来看看这个函数的原型:
DWORD NtQuerySystemInformation( DWORD dwRecordType,
PDWORD pdwHandleList,
DWORD dwNumBytes,
PDWORD pdwNumBytesRet );
我来解释一下,NtQuerySystemInformation这个函数有四个参数,第一个参数是dwRecordType,这个参数指定了我们所查询的系统信息类型,为了查询系统HANDLE列表,我们定义一个常量#define NT_HANDLE_LIST 16(这个数值我是查资料得到的,如果谁有更详细的资料,也请让我共享一下);第二个参数是一个指针,这个指针用来返回系统句柄列表,在调用NtQuerySystemInformation函数之前,必须为这个指针分配足够的内存空间,否则函数调用会出错;第三个参数是指定你为HandleList所分配的内存空间大小,单位是byte;第四个参数是NtQuerySystemInformation返回的HandleList的大小;如果NtQuerySystemInformation函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。
1、得到占用端口的PID。打开CMD, 命令:netstat -a -o 。
2、强行释放。命令:ntsd -c q -p PID
自己解决了,绑定之前加一个,重用端口
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1))
一拿到Fport的时候,我就对它进行了API分析,发现除了一些基本的API以外,它还调用了NTDLL.dll的几个未公开API,如NtQuerySystemInfomation,NtQueryInfomationProcess,直觉告诉我,关键应该在这两个函数中,特别是前者。为了能够理解Fport的运行机理,我们首先要来复习一下SOCKET。SOCKET究竟是什么?它的中文名称叫做套接口,但是,实际上我们所谓的SOCKET数据结构只是一个32位的无符号整数(在UNIX中是16位的),它对于Windows操作系统来说其实是一个文件句柄(SOCKET是文件?奇怪么?操作系统在底层实现的时候,常常使用文件的概念来完成一些基本的功能),这样的话问题就明朗了,如果我们能够枚举系统所有的句柄,从中获得属性为SOCKET的,不就可以完成Fport的功能?现在你应该想到了,为什么Fport要调用NtQuerySystemInfomation这个API,实际上,NtQuerySystemInfomation这个函数提供了一个简单的途径以获得系统所有的HANDLE,我们先来看看这个函数的原型:
DWORD NtQuerySystemInformation( DWORD dwRecordType,
PDWORD pdwHandleList,
DWORD dwNumBytes,
PDWORD pdwNumBytesRet );
我来解释一下,NtQuerySystemInformation这个函数有四个参数,第一个参数是dwRecordType,这个参数指定了我们所查询的系统信息类型,为了查询系统HANDLE列表,我们定义一个常量#define NT_HANDLE_LIST 16(这个数值我是查资料得到的,如果谁有更详细的资料,也请让我共享一下);第二个参数是一个指针,这个指针用来返回系统句柄列表,在调用NtQuerySystemInformation函数之前,必须为这个指针分配足够的内存空间,否则函数调用会出错;第三个参数是指定你为HandleList所分配的内存空间大小,单位是byte;第四个参数是NtQuerySystemInformation返回的HandleList的大小;如果NtQuerySystemInformation函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。
一旦NtQuerySystemInformation函数调用成功,系统中所有的句柄将被存放在pdwHandleList所指向内存空间中,其中,pdwHandleList所指向的第一个32位数,是这个buf所包含的句柄数量,之后是顺序排列的句柄指针pHandleInfo,指向的是HANDLEINFO结构:
typedef struct _HandleInfo
{
USHORT dwPid;
USHORT CreatorBackTraceIndex;
BYTE ObjType;
BYTE HandleAttributes;
USHORT HndlOffset;
DWORD dwKeObject;
ULONG GrantedAccess;
剩余30页未读,继续阅读
资源评论
- JUnique2013-05-03相当不错的资料,值得推荐
fairuyy
- 粉丝: 17
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功