跳转到内容

C Sharp IP 地址与端点

来自代码酷

C# IP地址与端点[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

在C#网络编程中,IP地址端点(EndPoint)是两个基础但至关重要的概念。IP地址用于标识网络中的设备,而端点则结合了IP地址和端口号,为网络通信提供了完整的定位信息。理解这些概念是构建任何网络应用程序的第一步。

IP地址分为IPv4(如192.168.1.1)和IPv6(如2001:0db8:85a3::8a2e:0370:7334)两种格式。在C#中,System.Net命名空间提供了处理这些地址和端点的类。

IP地址处理[编辑 | 编辑源代码]

C#使用IPAddress类表示IP地址。以下是常见操作:

创建IPAddress对象[编辑 | 编辑源代码]

using System.Net;

// 从字符串创建IPv4地址
IPAddress ipv4Address = IPAddress.Parse("192.168.1.1");

// 从字符串创建IPv6地址
IPAddress ipv6Address = IPAddress.Parse("2001:0db8:85a3::8a2e:0370:7334");

// 特殊地址
IPAddress loopback = IPAddress.Loopback;  // 本地环回地址(127.0.0.1)
IPAddress any = IPAddress.Any;           // 表示服务器应监听所有网络接口
IPAddress broadcast = IPAddress.Broadcast; // 广播地址(255.255.255.255)

检查IP地址类型[编辑 | 编辑源代码]

IPAddress someAddress = IPAddress.Parse("192.168.1.1");

if (someAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
    Console.WriteLine("这是一个IPv4地址");
}
else if (someAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
    Console.WriteLine("这是一个IPv6地址");
}

输出:

这是一个IPv4地址

端点(EndPoint)[编辑 | 编辑源代码]

端点结合了IP地址和端口号,在网络通信中标识特定的服务。C#提供了IPEndPoint类来表示这个概念。

创建IPEndPoint[编辑 | 编辑源代码]

// 创建监听所有网络接口、端口8080的端点
IPEndPoint endPoint1 = new IPEndPoint(IPAddress.Any, 8080);

// 创建特定IP和端口的端点
IPAddress ip = IPAddress.Parse("192.168.1.100");
IPEndPoint endPoint2 = new IPEndPoint(ip, 80);

Console.WriteLine($"端点1: {endPoint1}");
Console.WriteLine($"端点2: {endPoint2}");

输出:

端点1: 0.0.0.0:8080
端点2: 192.168.1.100:80

实际应用案例[编辑 | 编辑源代码]

简单的TCP服务器[编辑 | 编辑源代码]

以下是一个使用IPEndPoint的简单TCP服务器示例:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class SimpleTcpServer
{
    static void Main()
    {
        // 创建本地端点,端口号5000
        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 5000);
        
        // 创建TCP监听器
        TcpListener listener = new TcpListener(localEndPoint);
        listener.Start();
        
        Console.WriteLine("服务器已启动,等待连接...");
        
        // 接受客户端连接
        TcpClient client = listener.AcceptTcpClient();
        Console.WriteLine($"客户端已连接: {client.Client.RemoteEndPoint}");
        
        // 获取网络流
        NetworkStream stream = client.GetStream();
        
        // 读取客户端数据
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        
        Console.WriteLine($"收到数据: {data}");
        
        // 发送响应
        string response = "消息已接收";
        byte[] responseData = Encoding.ASCII.GetBytes(response);
        stream.Write(responseData, 0, responseData.Length);
        
        // 清理
        client.Close();
        listener.Stop();
    }
}

对应的TCP客户端[编辑 | 编辑源代码]

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class SimpleTcpClient
{
    static void Main()
    {
        // 服务器端点
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);
        
        // 创建TCP客户端并连接
        TcpClient client = new TcpClient();
        client.Connect(serverEndPoint);
        
        // 获取网络流
        NetworkStream stream = client.GetStream();
        
        // 发送消息
        string message = "Hello, Server!";
        byte[] data = Encoding.ASCII.GetBytes(message);
        stream.Write(data, 0, data.Length);
        Console.WriteLine($"已发送: {message}");
        
        // 接收响应
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine($"服务器响应: {response}");
        
        // 清理
        client.Close();
    }
}

网络通信流程[编辑 | 编辑源代码]

以下mermaid图展示了基本的网络通信流程:

ClientServer连接到服务器端点(IP:Port)接受连接发送数据返回响应关闭连接ClientServer

高级主题[编辑 | 编辑源代码]

域名解析[编辑 | 编辑源代码]

在实际应用中,我们通常使用域名而非直接IP地址。C#提供了Dns类来处理域名解析:

using System;
using System.Net;

class DnsExample
{
    static void Main()
    {
        // 解析主机名
        IPHostEntry hostEntry = Dns.GetHostEntry("www.example.com");
        
        Console.WriteLine($"主机名: {hostEntry.HostName}");
        Console.WriteLine("IP地址:");
        foreach (IPAddress address in hostEntry.AddressList)
        {
            Console.WriteLine($" - {address}");
        }
    }
}

端口号注意事项[编辑 | 编辑源代码]

端口号范围是0-65535,但:

  • 0-1023:知名端口,通常需要管理员权限
  • 1024-49151:注册端口
  • 49152-65535:动态/私有端口

常见问题[编辑 | 编辑源代码]

如何处理多个网络接口?[编辑 | 编辑源代码]

可以使用NetworkInterface类获取所有网络接口信息,然后为每个接口创建端点。

IPv4与IPv6兼容性[编辑 | 编辑源代码]

现代应用程序应该同时支持IPv4和IPv6。可以通过DualMode套接字实现这一点。

总结[编辑 | 编辑源代码]

  • IPAddress类表示网络中的设备地址
  • IPEndPoint类结合IP地址和端口号,标识特定服务
  • 实际应用中通常使用域名而非直接IP地址
  • 端口号选择应考虑权限和约定
  • 现代应用应同时支持IPv4和IPv6

理解这些基础概念是进行更复杂网络编程的前提。在实际开发中,这些类和方法将频繁使用,建议通过实践加深理解。