C#获取真实IP地址实现方法

下面是详细讲解“C#获取真实IP地址实现方法”的完整攻略和示例:

一、获取真实IP的意义

在进行网络编程开发时,获取客户端的真实IP地址非常重要,因为很多情况下客户端和服务器之间可能存在代理服务器、反向代理等中间层,这些中间层会在请求头中添加一些信息,从而导致服务器获取到的IP地址不是客户端的真实IP地址。因此,需要通过一些技术手段来获得客户端的真实IP地址。

二、获取真实IP的实现方法

1.获取客户端IP地址的常规方法

在C#编写的Web应用程序中,可以通过查找HTTP请求头中的"X-Forwarded-For"、"Proxy-Client-IP"、"WL-Proxy-Client-IP"等信息,来获取客户端真实的IP地址。具体代码如下:

public static string GetClientIP()
{
    string ip = string.Empty;
    if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
    {
        ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim();
    }
    else
    {
        ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
    }
    return ip;
}

2.通过Socket获取客户端IP地址

除了常规方法外,还可以通过Socket获取客户端的真实IP地址,具体代码如下:

public static string GetClientIP()
{
    string ip = string.Empty;
    try
    {
        ip = HttpContext.Current.Request.UserHostAddress;
        if (string.IsNullOrEmpty(ip) || ip == "::1")
        {
            //如果是本地访问
            IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHost.AddressList.Where(x => x.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();
            ip = ipAddress.ToString();
        }
    }
    catch
    {
        //如果获取失败
        ip = "";
    }
    return ip;
}

三、示例

示例一:获取客户端IP地址

下面是一个WebAPI控制器的示例,该控制器可用于获取客户端IP地址:

[Route("api/[controller]")]
[ApiController]
public class IPController : ControllerBase
{
    [HttpGet]
    public IActionResult GetIP()
    {
        string ip = HttpHelper.GetClientIP();
        if (string.IsNullOrEmpty(ip))
        {
            return NotFound();
        }
        else
        {
            return Ok(ip);
        }
    }
}

上述控制器可以通过访问"http://localhost:5000/api/IP"来获取客户端IP地址。

示例二:通过Socket获取客户端IP地址

下面是一个可以通过Socket获取客户端IP地址的示例,代码如下:

Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
listenSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080));
listenSocket.Listen(10); 
while (true)
{ 
    Socket clientSocket = listenSocket.Accept(); 
    string ip = ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString();
    Console.WriteLine(ip);
} 

上述代码会监听本地的8080端口,当有客户端连接时,会通过RemoteEndPoint属性获取客户端的IP地址。

四、总结

以上就是C#获取真实IP地址实现方法的攻略和示例。在实际开发过程中,根据实际需求和环境选择恰当的方法获取客户端IP地址。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#获取真实IP地址实现方法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Unity中Instantiate实例化物体卡顿问题的解决

    关于Unity中Instantiate实例化物体卡顿问题的解决,我整理了以下攻略: Unity中Instantiate实例化物体卡顿问题的解决 问题描述 在Unity开发过程中,使用Instantiate()函数实例化物体时,会出现卡顿现象,特别是当要大量实例化物体时,卡顿现象会更加明显。 解决方法 方法一:使用对象池 使用对象池是一种常见的解决Instan…

    C# 2023年6月3日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

    在前两篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) 我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.net co…

    C# 2023年4月30日
    00
  • C#中委托的基本概念介绍

    下面我将详细讲解” C#中委托的基本概念介绍”: 委托 委托(Delegate)是C#中一个非常重要的概念,被称为“对象安全的函数指针”。委托可以指向一个具有特定参数列表和返回类型的方法。将方法封装在一个委托中,就可以像调用方法一样调用委托。委托在多线程编程、事件处理等方面有着广泛的应用。 委托的定义 C#中委托类型的定义通常需要指定该委托所能绑定的方法签名…

    C# 2023年5月15日
    00
  • C#文件非占用读取与帮助类FileHelper

    C#的FileHelper类库提供了许多方便的方法来处理文件读写操作,FileHelper类库中的File类封装了很多文件读写的方法,同时还提供了非占用读取文件的方法,可以有效防止文件被占用而无法进行读取或写入操作。 非占用读取文件 在进行文件读写操作时,有时候文件可能被其他应用程序或者进程占用而无法进行读写操作。FileHelper类库提供了一种解决方法:…

    C# 2023年6月1日
    00
  • .NET性能优化之为结构体数组使用StructLinq的问题解析

    针对“.NET性能优化之为结构体数组使用StructLinq的问题解析”,以下是详细的攻略: 1. 为什么要使用StructLinq 在.NET开发中,数据遍历或是筛选排序等操作是开发者经常会遇到的问题,直接使用foreach进行操作会存在性能衰减的问题,而使用LINQ进行操作虽然性能有所提高,但是GC会频繁出现。 而使用StructLinq可以解决这一问题…

    C# 2023年6月1日
    00
  • JavaScript面向对象分层思维全面解析

    下面我将和您详细讲解“JavaScript面向对象分层思维全面解析”的完整攻略。 什么是JavaScript面向对象分层思维 JavaScript面向对象分层思维是一种针对JavaScript编程语言的面向对象设计模式。它将对象分为三个层次:业务层、数据层和界面层。每个层次都有自己独特的对象和属性。在JavaScript面向对象分层思维中,每个层次都是相互独…

    C# 2023年5月31日
    00
  • C#导出GridView数据到Excel文件类实例

    下面是“C#导出GridView数据到Excel文件类实例”的完整攻略: 1. 导出GridView数据到Excel的需求背景 在ASP.NET应用程序中,我们通常需要将一些数据在前端展示出来,但是很多时候,这些数据可能需要进行导出,方便用户下载、保存。其中,将数据导出到Excel文件中是比较常见的需求之一,下面我们就来介绍如何使用C#实现将GridView…

    C# 2023年6月1日
    00
  • C#难点逐个击破(2):out返回参数

    当我们在编写C#函数的返回值时,有时候需要返回多个参数,但是C#并不支持多返回值,这时候可以使用out参数来实现。 解释out参数的使用方法 out参数是C#中的一个关键字,它可以将一个函数所使用的某些值作为引用传递,以便在函数返回后继续使用。 举个例子,我们通过下面的代码来解释以下out参数的使用方法: void SetRGB(out int red, o…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部