首先,我必须指出,在这种情况下,我没有任何专用服务器。但我知道服务器的IP。所以问题是,如果客户端连接到那个IP,我怎么知道它使用哪个客户端IP?因为客户端可以有多个网络适配器,所以每个适配器都连接到不同的网络。此外,服务器不需要与客户端在同一个LAN中,在客户端的数据包到达服务器之前可能需要几个跃点。我们知道服务器的IP,在这种情况下我们如何才能知道客户机的IP?
因为我们没有专用服务器,所以我们无法通过某个服务器应用程序(某种客户端管理器)检测客户端的IP。此外,Ping类在这种情况下似乎没有帮助,而且在一般情况下,服务器不需要启用Ping。目前,服务器只是一个SQL server,客户端直接对其执行某些查询。我知道,当客户机对我的Server执行查询时(使用sys.dm_exec_connections),我们可以获得它的IP,但对我来说,它只是最后的手段。我想直接从客户端找到另一种方法(而且不涉及Server)。
这是我能遵循的最接近的方法,但我不知道它为什么选择最后一个地址?
var hn = System.Net.Dns.GetHostName();
var ipEntry = System.Net.Dns.GetHostEntry(hn);
IPAddress[] addr = ipEntry.AddressList;
var ip = addr[addr.Length - 1].ToString();//why the last?无论哪种方式,都有许多IP地址(不是直接在同一个局域网中)是不包含在AddressList中的。
我的问题是在客户机(从客户机上的某个可用的网络适配器开始)和服务器(预先知道IP )之间查找所有可能的网络路径。在大多数情况下,应该只有一个可用的路径(所以我们应该只找到一个客户端的IP)。尝试从客户端发送一些请求可能需要找到路径,但我目前不知道它是如何完成的。
发布于 2017-12-15 17:46:53
您可以使用服务器端的任何可用侦听端口(HTTP端口、SSH端口或server端口)从客户端轻松完成此操作。下面是一个小型python程序:
import sys
import socket
if len(sys.argv) != 3:
print("Usage: {} ip-or-hostname port-number".format(sys.argv[0]))
sys.exit(1)
hostname = sys.argv[1]
port = int(sys.argv[2])
s = socket.socket()
s.connect((hostname, port))
print(s.getsockname()[0])它所做的是创建到目标系统的连接,然后使用getsockname系统调用来提供连接中使用的本地地址。此本地地址将始终对应于客户端接口之一。
因此,例如,如果我使用参数www.google.com 80运行它,我得到:
python /tmp/disc.py www.google.com 80
192.168.0.110如果我给它一个不同本地子网上机器的地址和端口,我会得到:
python /tmp/disc.py 192.168.40.128 22
192.168.40.131返回的两个地址对应于本地系统上的两个不同接口:
ip -4 addr
[snipped]
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.0.110/24 brd 192.168.0.255 scope global dynamic ens33
valid_lft 166968sec preferred_lft 166968sec
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.40.131/24 brd 192.168.40.255 scope global ens34
valid_lft forever preferred_lft forever我相信您可以很容易地在C#中实现相同的程序--只是我不太熟悉这种语言。
发布于 2017-12-16 01:55:30
看来我错过了一个重要的内建课程,作为一个客户(我们有HttpClient,WebClient .但在这种情况下,我需要一个TcpClient)。这可以尝试连接到某个IP (提供了一些端口),如果成功,我可以获得基础webSocket的解析webSocket。它可以转换为字符串,但我可以解析它使用的客户机IP (字符串格式类似于IP:port)。以下是实现我想要的目标的几行代码:
public string GetIPConnectingTo(string targetIP, int port = 80){
try {
using(var tc = new TcpClient(targetIP, port)){
return tc.Client.LocalEndPoint.ToString().Split(':')[0];
}
}
catch {
return null;
}
}https://stackoverflow.com/questions/47827216
复制相似问题