C# 显示本地计算机的IP地址以便连接到网络外部?

C# 显示本地计算机的IP地址以便连接到网络外部?,c#,tcp,server,ip,C#,Tcp,Server,Ip,我正在尝试做一个简单的服务器,我可以在学校和家之间使用。服务器工作正常,客户端可以连接。但我希望能够从本地网络外部进行连接。我正在试图找到一种方法来显示连接到它所需的机器的IP地址: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net

我正在尝试做一个简单的服务器,我可以在学校和家之间使用。服务器工作正常,客户端可以连接。但我希望能够从本地网络外部进行连接。我正在试图找到一种方法来显示连接到它所需的机器的IP地址:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;

namespace SocketProgramming
{
    class Program
    {

    private static byte[] _buffer = new byte[1024];
    private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    private static List<Socket> _clientSockets = new List<Socket>();
    private static List<string> _nicknames = new List<string>();

    static void Main(string[] args)
    {

        SetupServer();
        Console.ReadLine();

    }

    private static void SetupServer()
    {

        Console.Write("Enter a port number to establish the server on: ");
        int portNum = Int32.Parse(Console.ReadLine());
        _serverSocket.Bind(new IPEndPoint(IPAddress.Any, portNum));
        _serverSocket.Listen(5);

        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

    }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Net.Sockets;
Net系统;
命名空间SocketProgramming
{
班级计划
{
专用静态字节[]_buffer=新字节[1024];
私有静态套接字_serverSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
私有静态列表_clientSockets=new List();
私有静态列表_昵称=新列表();
静态void Main(字符串[]参数)
{
SetupServer();
Console.ReadLine();
}
私有静态void SetupServer()
{
编写(“输入一个端口号以在其上建立服务器:”);
intportnum=Int32.Parse(Console.ReadLine());
_Bind(新的IPEndPoint(IPAddress.Any,portNum));
_serverSocket.Listen(5);
_serverSocket.BeginAccept(新的AsyncCallback(AcceptCallback),null);
}
}
}
如何获取本地计算机的IP地址?我希望能够在任何机器上运行此代码,因此在代码中使用静态IP不会有任何帮助。

这对我解决相同问题非常有帮助。我的实现代码最后使用了一个轻微的修改来指定我想要的协议类型

string localIP;

        try
        {
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP))
            {
                socket.Connect("8.8.8.8", 65530);
                IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
                localIP = endPoint.Address.ToString();
            }
        }
        catch (Exception ex)
        {
            localIP = String.Empty;
        }

        return localIP;
这对我解决同样的问题非常有帮助。我的实现代码最后使用了一个轻微的修改来指定我想要的协议类型

string localIP;

        try
        {
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP))
            {
                socket.Connect("8.8.8.8", 65530);
                IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
                localIP = endPoint.Address.ToString();
            }
        }
        catch (Exception ex)
        {
            localIP = String.Empty;
        }

        return localIP;

值得注意的是,一台机器可能有多个IP地址。您可以从dos或powershell命令行使用“ipconfig”命令获取快速列表。您可以在c#中执行类似操作,如下所示:

        foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces()) {
            Console.WriteLine("Name: " + netInterface.Name);
            Console.WriteLine("Description: " + netInterface.Description);
            Console.WriteLine("Addresses: ");
            IPInterfaceProperties ipProps = netInterface.GetIPProperties();
            foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses) {
                Console.WriteLine(" " + addr.Address.ToString());
                }
            Console.WriteLine("");
            }
见:


此外,如果试图访问远程计算机,可能会遇到防火墙/路由器问题。如果您的主机ip是非路由地址(如10.*.*或192.168.*.*等),您将无法从该网络外部访问它。

值得注意的是,一台机器可能有多个ip地址。您可以从dos或powershell命令行使用“ipconfig”命令获取快速列表。您可以在c#中执行类似操作,如下所示:

        foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces()) {
            Console.WriteLine("Name: " + netInterface.Name);
            Console.WriteLine("Description: " + netInterface.Description);
            Console.WriteLine("Addresses: ");
            IPInterfaceProperties ipProps = netInterface.GetIPProperties();
            foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses) {
                Console.WriteLine(" " + addr.Address.ToString());
                }
            Console.WriteLine("");
            }
见:


此外,如果试图访问远程计算机,可能会遇到防火墙/路由器问题。如果您的主机ip是非路由地址(如10.*.*或192.168.*.*等),您将无法从该网络外部访问该地址。

我猜您的“服务器”将位于您的家庭网络中,而您的客户端将在该网络外部运行。在这种情况下,您需要知道服务器的IP地址,这将是您家庭网络的公共IP地址。此值不是静态的,除非您使用某些服务($$)为您的家庭获取静态IP地址。@ThomasWeller该服务修复了此值。谢谢你,巴德!我猜您的“服务器”将位于您的家庭网络中,而您的客户端将在此网络之外运行。在这种情况下,您需要知道服务器的IP地址,这将是您家庭网络的公共IP地址。此值不是静态的,除非您使用某些服务($$)为您的家庭获取静态IP地址。@ThomasWeller该服务修复了此值。谢谢你,巴德!