首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取用于连接到某个目标IP的客户端IP?

获取用于连接到某个目标IP的客户端IP?
EN

Stack Overflow用户
提问于 2017-12-15 06:51:19
回答 2查看 586关注 0票数 0

首先,我必须指出,在这种情况下,我没有任何专用服务器。但我知道服务器的IP。所以问题是,如果客户端连接到那个IP,我怎么知道它使用哪个客户端IP?因为客户端可以有多个网络适配器,所以每个适配器都连接到不同的网络。此外,服务器不需要与客户端在同一个LAN中,在客户端的数据包到达服务器之前可能需要几个跃点。我们知道服务器的IP,在这种情况下我们如何才能知道客户机的IP?

因为我们没有专用服务器,所以我们无法通过某个服务器应用程序(某种客户端管理器)检测客户端的IP。此外,Ping类在这种情况下似乎没有帮助,而且在一般情况下,服务器不需要启用Ping。目前,服务器只是一个SQL server,客户端直接对其执行某些查询。我知道,当客户机对我的Server执行查询时(使用sys.dm_exec_connections),我们可以获得它的IP,但对我来说,它只是最后的手段。我想直接从客户端找到另一种方法(而且不涉及Server)。

这是我能遵循的最接近的方法,但我不知道它为什么选择最后一个地址?

代码语言:javascript
复制
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)。尝试从客户端发送一些请求可能需要找到路径,但我目前不知道它是如何完成的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-15 17:46:53

您可以使用服务器端的任何可用侦听端口(HTTP端口、SSH端口或server端口)从客户端轻松完成此操作。下面是一个小型python程序:

代码语言:javascript
复制
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运行它,我得到:

代码语言:javascript
复制
python /tmp/disc.py www.google.com 80
192.168.0.110

如果我给它一个不同本地子网上机器的地址和端口,我会得到:

代码语言:javascript
复制
python /tmp/disc.py 192.168.40.128 22
192.168.40.131

返回的两个地址对应于本地系统上的两个不同接口:

代码语言:javascript
复制
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#中实现相同的程序--只是我不太熟悉这种语言。

票数 0
EN

Stack Overflow用户

发布于 2017-12-16 01:55:30

看来我错过了一个重要的内建课程,作为一个客户(我们有HttpClient,WebClient .但在这种情况下,我需要一个TcpClient)。这可以尝试连接到某个IP (提供了一些端口),如果成功,我可以获得基础webSocket的解析webSocket。它可以转换为字符串,但我可以解析它使用的客户机IP (字符串格式类似于IP:port)。以下是实现我想要的目标的几行代码:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47827216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档