【问题标题】:Find source process from TcpClient/TcpListener从 TcpClient/TcpListener 中查找源进程
【发布时间】:2016-12-25 12:36:57
【问题描述】:

我开发了一个 c# 应用程序,使用 TcpClient/TcpListener 来监听本地机器上其他应用程序的请求。现在我需要确定实际连接到我的听众的进程。

有一些示例使用 GetExtendedTcpTable 来查看哪些进程正在使用哪些端口。但是,在与我的听众的每个连接上运行似乎是一项非常昂贵的操作。系统必须知道谁在建立连接,对吗?我只是找不到通过任何对象暴露的信息。有没有 Winsock 大师愿意伸出援手?

【问题讨论】:

  • 最坏的情况,你总是可以使用执行netstat -no 并解析结果。
  • 也看到了那个。但同样,它似乎会给每个 TCP 连接增加大量开销。毕竟,由于连接发生变化,我无法对其进行缓存。
  • 想一想,Fiddler 允许您按进程过滤,因此必须有一种方法以某种有效的方式获取数据,因为 Fiddler 不会导致流量变慢。 ..
  • 您可以 PInvoke GetExtendedTcpTableFunction。这是一个示例code.msdn.microsoft.com/C-Sample-to-list-all-the-4817b58f 您需要稍微调整它以获取 PID,但这就是您想要的 API 调用。
  • 这是一个更好的例子,它实际上得到了 PID。 stackoverflow.com/questions/577433/…

标签: c# .net winsock tcpclient tcplistener


【解决方案1】:

据我所知,没有托管 API,唯一的选择是 pInvoke Windows API。

Windows API 可通过“IPHlpApi.dll”和“IpHelperAPI.dll”获得,但获取端口所需的特定部分没有记录。

[DllImport("iphlpapi.dll",SetLastError=true)]
public static extern int GetTcpTable(byte[] pTcpTable, 
   out int pdwSize, bool bOrder);  

托管包装器的源代码可以在here找到。

【讨论】:

  • 不幸的是,一次发生的请求太多了,这种方法无法让我隔离我的 TcpListener 正在与之交谈的特定进程。我从 PInvoke 获得的表太不连贯了,只是给了我一个最近的进程来达到我的监听端点。
猜你喜欢
  • 2017-01-02
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2011-04-07
  • 2013-09-06
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多