TcpListener TcpClient get IPAddress

3
我希望能够从服务器端获取 IP地址
TcpListener ftp_listener = new TcpListener(IPAddress.Any, ftpport);
 newclient = listener.AcceptTcpClient();

请问如何查找新客户端的IP地址?

客户端方面

TcpClient ftpclient = new TcpClient();
 ftpclient.Connect(ipAddress, ftpport);

如何查找 ftpclient 的 IP 地址?

目前我正在使用:

 TcpClient ftpclient = new TcpClient();

            //get IpAddress of Server
#pragma warning disable CS0618 // Type or member is obsolete
            IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
#pragma warning restore CS0618 // Type or member is obsolete

            ftpclient.Connect(ipAddress, ftpport);// "192.168.1.160", ftpport);

请问有没有更好的方法将一个字符串转为整数?

谢谢。


所以你在同一台机器上有服务器和客户端。通常,用户需要提供客户端连接的地址(或主机)。所以,我很难看出你的意图。你可以迭代你的网络适配器,但这有什么意义呢? - Fildor
使用newClient.Client.RemoteEndPoint.ToString()newClient.Client提供了底层的套接字。 - Oguz Ozgul
我正在同一台电脑上进行测试... 我需要一种找到每个计算机客户端的 IP 地址的方法。 - dwk
1
@Fildor,他可能正在编写一个FTP客户端,而PASV/PORT命令意味着对话的一方需要告诉另一方使用哪个IP地址/端口。 - Caius Jard
@CaiusJard 啊,对了。那很有道理。 - Fildor
2个回答

6

无论是服务器还是客户端,获取远程端点(IP地址和端口)的方法都是相同的。

  1. Get the client IP Address on the server:

    IPEndPoint remoteIpEndPoint = newclient.Client.RemoteEndPoint as IPEndPoint;
    Console.WriteLine("Client IP Address is: {0}", remoteIpEndPoint.Address);
    
  2. Get the server IP Address on the client:

        IPEndPoint remoteIpEndPoint = ftpclient.Client.RemoteEndPoint as IPEndPoint;
        Console.WriteLine("FTP Server IP Address is: {0}", remoteIpEndPoint.Address);
    

1

首先你的服务器代码有误,不能在启动服务器之前接受客户端连接,因此代码需要像这样:

TcpListener ftp_listener = new TcpListener(IPAddress.Any, ftpport);
ftp_listener.Start();
var newclient = listener.AcceptTcpClient();

// getting the client ip 2 ways :
var clientIpLAN = newclient.Client.LocalEndPoint; // locally this return "127.0.0.1:[YourServerFTPPort]"
var clientIpWAN = newclient.Client.RemoteEndPoint; // locally this return "127.0.0.1:[totally random port]"

客户端要获取服务器IP,这是不可能通过魔法找到的。你需要知道你想要连接的位置。有很多方法,但所有方法都需要一个静态位置,你知道它总是可用的。例如,一个Web服务可以给你一个IP列表(或单个IP),这些IP现在可以连接。你可能有一个Web数据库,其中包含你可以连接的IP。如果你总是在同一台计算机上运行服务器和客户端,则 localhost127.0.0.1 几乎总是有效的,前提是没有主机文件的问题。


难道不应该是RemoteEndPoint吗? - Oguz Ozgul
@OguzOzgul 你说得对,我应该提一下。这将取决于他的需求。Remote会返回广域网(WAN),而Local则是局域网(LAN)。 - Franck
不,LocalEndPoint将返回TCP连接被接受的IP地址和端口。我们正在监听特定的端口,但是当我们接受一个TCP连接时,它会在另一个空闲的端口上被接受。RemoteEndPoint将给出目标(远程)IP地址和端口。 - Oguz Ozgul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接