Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有关远程IP地址的信息_C#_Sockets_Network Programming - Fatal编程技术网

C# 有关远程IP地址的信息

C# 有关远程IP地址的信息,c#,sockets,network-programming,C#,Sockets,Network Programming,我想跟踪计算机与之通信的所有IP地址。我正在使用C#和Visual Studio。有一个列表框,我将把所有远程IP地址放在其中。我是网络编程新手,所以我需要一些关于这类问题的指导 我的问题是如何做到这一点?如何获取有关我的计算机连接的远程IP地址的信息?假设您的代码中有ObservableCollection MacAccessInfo作为绑定到列表的公共可见变量,您可以将其放在代码中侦听连接的部分: Socket socketForClient = tcpListener.AcceptSock

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


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

假设您的代码中有
ObservableCollection MacAccessInfo
作为绑定到列表的公共可见变量,您可以将其放在代码中侦听连接的部分:

Socket socketForClient = tcpListener.AcceptSocket( );

if (socketForClient.Connected)
{
    mAccessInfo.Add(socketForClient.RemoteEndPoint.ToString());
    //do other stuff...
}
因为它是ObservableCollection,所以在进入列表的每个新连接上,您绑定到的列表都会更新


编辑:正如Cody Gray指出的那样,如果将IP作为代理/路由器/NAT等介于两者之间,这将不起作用。

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

如果你想访问整个机器正在讨论的所有IP,你必须使用一个较低级别的API。这在操作系统之间是不标准的。对于Windows,我会查看Winsock API,看看您是否可以找到如何查看操作系统的tcp/ip堆栈。它变得更加复杂,因为TCP连接位于IP数据包之上。你想看哪一个层次?只是TCP,或者所有也在IP之上的协议。将ARP、UDP、TCP、ICMP命名为标准视图

如果您只是在学习,那么只需要做一个简单的服务器,并且在您的过程中与该服务器进行的所有连接都要简单得多。下跌会很快跳入深部。我不是说你不应该这样。您是想保持简单并保持与您的流程对话的连接,还是想进入深邃黑暗的窗口的森林?选择你的冒险


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

你可以利用
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...
您可以使用.Net调用此命令并解析文本输出,例如:


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

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


导入的C函数需要使用
[DllImport(“iphlapi.dll”)]
标记,并根据要导入的函数使用任何其他相关属性。您可以在上阅读更多关于PInvoke的信息,或者在上找到一些已经编写好的导入。此外,还有一个工具可以尝试为您自动化大部分信息,您是否坐在路由器后面?或者你有直接的互联网连接吗?你关心远程服务器,还是只关心本地网络上的服务器?我使用的是Aolynk路由器。现在我只想知道如何获取我的计算机与之联系的任何远程IP地址的信息。你是只想将远程地址连接到你的程序,还是希望计算机的所有连接(如
netstat
命令)@Cody为什么你认为路由器是相关的?如果远程主机位于路由器后面,您将获得其路由器的地址。但是在你的互联网上安装路由器应该不会有任何影响。@CodeInChaos:严格地说,可能不会。但是现在绝大多数路由器都默认打开了NAT(如果没有,他们应该打开)。这肯定会使事情复杂化,因为它在客户端机器之外进行IP地址转换。例如,在我坐的机器上运行
netstat
,所有东西都是一个私有IP,尽管我显然连接到了Internet。不仅仅是我的程序与之通信的IP地址。我电脑上的每个连接。类似于记录有关连接活动的信息。如果你只是在学习,那么只做你的程序就更容易了,这就是我要指出的。您必须使用WinPcap或Winsock之类的工具才能查看该信息。或者编写一个插入TCP堆栈的网络驱动程序过滤器。OSI网络模型有层次,因此您的进程停留在第4层的应用层,下一层是第3层的TCP、UDP等,然后是第2层的IP、ARP和第1层的以太网(这是硬件,因此您不能在这一层编写软件,但可以从中读取)。当你深入到各个层时,它的级别会降低。可靠地解析文本输出几乎是不可能的。它可以随每个windows版本而更改。而且是本地化的。在德国windows XP上,它看起来是这样的:“Aktive Verbindungen Proto Lokale Adrese RemoteAdrese Status T