请教TcpView实现

jackholy 2008-04-16 09:42:33
列出网络连接,能对指定连接中止,具有netstat -ano功能,能像TcpView一样动态实时刷新。
查过很多API :NetSessionEnum;GetTcpTable;SnmpExtensionQuery;NetSessionDel....
但要能实时刷新并能中断指定IP连接,就不知道哪个更好使?特别是要能中止本机对指定IP的连接,而不关闭进程。
那位大侠有思路,能有demo学习学习更好。

...全文
359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
jackholy 2008-04-16
  • 打赏
  • 举报
回复
自己解决了 谢谢
jackholy 2008-04-16
  • 打赏
  • 举报
回复
这里要指出的一点就是,绝大多数程序都是由于程序编写不完善所造成的死连接,即对 Socket 未能进行完善的管理,导致占用端口导致服务器资源耗尽。当然,很多情况下,程序可能不是我们所写,而由于程序代码的复杂、杂乱等原因所导致难以维护也是我们所需要面对的。

网上有很多文章都提到 Socket 长时间处于 CLOSE_WAIT 状态下的问题,说可以使用 Keepalive 选项设置 TCP 心跳来解决,但是却发现设置选项后未能收到效果 。

因此,这里我分享出自己的解决方案:

Windows 中对于枚举系统网络连接有一些非常方便的 API:

* GetTcpTable : 获得 TCP 连接表
* GetExtendedTcpTable : 获得扩展后的 TCP 连接表,相比 GetTcpTable 更为强大,可以获取与连接的进程 ID
* SetTcpEntry : 设置 TCP 连接状态,但据 MSDN 所述,只能设置状态为 DeleteTcb,即删除连接

相信大多数朋友看到这些 API ,就已经了解到我们下一步要做什么了;枚举所有 TCP 连接,筛选出本进程的连接,最后判断是否 CLOSE_WAIT 状态,如果是,则使用 SetTcpEntry 关闭。

其实 Sysinternal 的 TcpView 工具也是应用上述 API 实现其功能的,此工具为我常用的网络诊断工具,同时也可作为一个简单的手动式网络防火墙
jackholy 2008-04-16
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_56ea069101000cet.html

利用iphlpapi.dll所提供的函数实现一个简易防火墙的功能 流云 /2007/10/17/ QQ:52984783 Email:ytmGring@163.com

1.先介绍一下几个重要的数据结构以及相关函数

struct MIB_TCPROW //它用来保存单个TCP连接的信息
{
DWORD dwState;//连接状态
DWORD dwLocalAddr;//本地IP地址
DWORD dwLocalPort;//本地端口
DWORD dwRemoteAddr;//远程IP地址
DWORD dwRemotePort;//远程端口
};

struct MIB_TCPTABLE //用来保存整个计算机内所有的TCP连接的信息.把它称之为TCP连接表
{
DWORD dwNumEntries;//应该是连接数
MIB_TCPROW table[ANY_SIZE];//其中ANY_SIZE为任意大小
};

DWORD GetUdpTable(MIB_TCPTABLE*table,DWORD *size,bool bf);

2.通过上面的函数GetUdpTable()可以获取当前系统内所有的TCP连接的信息
通过在一个循环内不断的调用此函数,可以达到监控系统内TCP连接的目的.
通过比较两次调用上面函数所得的MIB_TCPTABLE结构中的dwNumEntries成员的值.
可以判断出系统内是否有新连接产生.或者有旧的连接被删除.
一般我们要处理的就是当有新的连接产生时的情况.
具体的对连接进行处理的方法通过是对整个TCP连接表进行遍历.来对每一个TCP连接进行操作.
最典型的操作是调用SetTcpEntry()函数来设置TCP连接的状态.
函数原型:
DWORD SetTcpEntry(MIB_TCPROW*tcprow);
#define MIB_TCP_STATE_DELETE_TCB 12
在设置时经常用到的状态为MIB_TCP_STATE_DELETE_TCB(删除连接)
例:
先设置状态等于MIB_TCP_STATE_DELETE_TCB
tcprow->dwState=MIB_TCP_STATE_DELETE_TCB;
然后调用SetTcpEntry()函数来删除该连接
SetTcpEntry(tcprow);
CathySun118 2008-04-16
  • 打赏
  • 举报
回复
没有demo,关注
scq2099yt 2008-04-16
  • 打赏
  • 举报
回复
up

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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