TCP连接创建和关闭事件挂钩[关闭]

Posted

技术标签:

【中文标题】TCP连接创建和关闭事件挂钩[关闭]【英文标题】:TCP Connection Creation and Closing Event Hooking [closed] 【发布时间】:2011-02-07 20:44:46 【问题描述】:

C# 提供了哪些帮助类来监视操作系统上的所有 TCP 连接。一段示例代码也将不胜感激。

注意: 最初的意图是在 Windows 上监控这一点,但在其他使用 .Net Core 的操作系统上也可以这样做。

【问题讨论】:

您想监控一台机器上的 tcp ip 端口吗? 是的,想监控端口的生命周期,即端口从创建到关闭的持续时间 我认为您可能将端口与套接字(连接)混淆了。端口是地址片段,没有状态(如“关闭”),而套接字可以处于多种状态(如“正在侦听”、“连接”、“关闭”等)。您可以在同一个端口上有多个连接的套接字(就像一个 Web 服务器在端口 80 上有许多连接的客户端),但每个端口只有一个侦听套接字。那么您想监控所有套接字活动,还是只想监控绑定到特定端口的监听套接字(即从它们开始监听到停止监听的那一刻)? Windows 所有版本特别是服务器 【参考方案1】:

假设你想监控机器上的 TCP 套接字,你可以使用 System.Net.NetworkInformation.GetActiveTcpConnections 来给你一个 TCP 连接列表和每个连接的当前状态。您可以调用常规计时器来获取套接字的更新状态。

我比较熟悉这方面的 Win32 API,例如 GetTcpTable 和文档较少的 GetTcpTableEx,后者还提供了拥有本地端点的进程的进程 ID。所以上面的内容可能并不完全符合我的想法:)

当然,如果您需要在创建 tcp 套接字之前或之后立即收到通知,或者它的状态发生变化,那么不幸的是,这需要一个无法用 .NET 编写的内核模式驱动程序。

【讨论】:

我知道netstat -b 需要提升权限,所以如果GetTcpTableEx(...) 提供相同的功能,那么它可能还需要管理员权限。 您不需要处于内核模式:Windows 的事件跟踪:msdn.microsoft.com/en-us/library/bb968803.aspx【参考方案2】:

如果您真的需要基于事件的机制,Windows 的事件跟踪是您的最佳选择。既然你说这只是一个偏好:) 你最好使用 windows api (c/c++) 编写这个。

http://msdn.microsoft.com/en-us/library/aa964766(v=vs.85).aspx

从 .NET 3.5 开始,部分事件跟踪可通过 .NET 使用 System.Diagnostics.Eventing 命名空间进行访问。我知道这在 .NET 4.0 中得到了改进。我自己没有研究过,所以我不知道是否可以进行 TCP 连接检测。

我确信你可以使用 windows api 和 ETW 做你想做的事。

【讨论】:

以上是关于TCP连接创建和关闭事件挂钩[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

tcp关闭状态详解

如何在 c++/c 中通过 socks 代理创建基本的 TCP 连接? [关闭]

如何关闭一个TCP连接

第13章 TCP编程_TCP的连接和关闭过程

在 Node.js HTTP 服务器上重用 TCP 连接

tcp连接状态详解