有关远程IP地址的信息

时间:2011-01-22 15:27:59

标签: c# sockets network-programming

我想跟踪计算机正在与之通信的所有IP地址。我正在使用C#和Visual Studio。有一个listBox,我将在其中放置所有远程IP地址。我是网络编程的新手,所以我需要一些关于这类问题的方向。

我的问题是如何做到这一点?如何获取有关我的计算机连接的远程IP地址的信息?

4 个答案:

答案 0 :(得分:3)

您可以利用netstat命令获取有关您的计算机与之通信的IP地址和端口的信息。您可以定期运行此命令并解析文本输出。

例如,以下命令将列出所有连接的状态,包括本地和远程连接详细信息:

C:\Users\chibacity>netstat -a -n

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    10.0.0.107:32495       209.85.229.125:5222    ESTABLISHED
  TCP    10.0.0.107:32507       209.85.229.125:5222    ESTABLISHED
  TCP    10.0.0.107:32520       209.85.229.18:443      ESTABLISHED
  TCP    10.0.0.107:32755       209.85.227.109:993     ESTABLISHED
  //etc...

如果您有管理员权限,您也可以获得可执行的详细信息:

PS C:\Windows\system32> netstat -a -n -b

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    10.0.0.107:32495       209.85.229.125:5222    ESTABLISHED
 [googletalk.exe]
  TCP    10.0.0.107:32507       209.85.229.125:5222    ESTABLISHED
 [chrome.exe]
  TCP    10.0.0.107:32520       209.85.229.18:443      ESTABLISHED
 [chrome.exe]
  TCP    10.0.0.107:32755       209.85.227.109:993     ESTABLISHED
  //etc...

您可以使用System.Diagnostics.Process从.Net调用此命令并解析文本输出,例如:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

答案 1 :(得分:2)

大多数套接字编程应用程序都与TCP套接字API通信,这些API在操作系统之间大致标准化。如果您只是想编写一个简单的服务器并可视化客户端与您在服务器中运行的服务器进行通信非常简单。但是,您的进程无法通过典型的套接字API看到套接字连接与您机器上的其他进程通信。

如果您想要访问所有IP,整个计算机也在谈论,您将不得不使用较低级别的API。 OS之间没有标准化。对于Windows,我会查看Winsock API以了解您是否可以找到如何查看操作系统的tcp / ip堆栈。它变得更加复杂,因为TCP连接位于IP数据包之上。你想看什么级别?只是TCP,或所有也在IP之上的协议。 ARP,UDP,TCP,ICMP命名视图标准。

如果您只是在学习,那么只做一个简单的服务器,并且在您的过程中与该服务器通信的所有连接都要简单得多。走得更低将迅速进入深渊。不是我说你不应该这样。你想保持简单并保持与你的过程交流的联系,或者你想进入深黑暗的窗户森林吗?选择你的冒险。

编辑:更低级别访问的更好选择是带有C#包装器的WinPcap。这将让您获得原始数据包信息。甚至让你的PC处于混杂模式,并嗅探子网上的所有流量,而不仅仅是你的PC。

答案 2 :(得分:2)

在Windows上,有一个IP帮助程序库iphlpapi,它可以发现有关计算机上打开连接的信息。特别是,您希望查看GetTcpTableGetUdpTable函数。

问题是这是一个C API。要从C#中使用它们,您需要使用P / Invoke API。这是一项微不足道的任务,但可能需要一些时间。所使用的每个C结构都需要在C#中重写,利用System.Runtime.InteropServices命名空间来编组它们。其中大部分可以自动化,或者通过使用正确的属性修饰结构字段来完成,但是可能存在需要手动编组结构的情况。

导入的C函数需要使用[DllImport("iphlpapi.dll")]标记,并根据您导入的函数使用任何其他相关属性。您可以在msdn阅读有关PInvoke的更多信息,也许可以在pinvoke wiki找到一些已编写的导入内容。此外,有一种工具可以尝试为您自动化大部分工作Pinvoke interop assitant

答案 3 :(得分:1)

假设您的代码中某处ObservableCollection<string> mAccessInfo作为绑定到列表的公开可见变量,您可以将其放在代码中侦听连接的部分:

Socket socketForClient = tcpListener.AcceptSocket( );

if (socketForClient.Connected)
{
    mAccessInfo.Add(socketForClient.RemoteEndPoint.ToString());
    //do other stuff...
}

由于它是ObservableCollection,在每个进入列表的新连接上,您绑定的列表都会更新。

编辑:正如Cody Gray指出的那样,如果你的IP介于代理/路由器/ NAT等之后,这将无效......