You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Visual Studio中获取WebClient实例实际使用的源IP

获取WebClient实例实际使用的源IP(无需网络分析工具)

好问题!要在Visual Studio中直接获取WebClientEx实例实际使用的源IP,不需要依赖Wireshark这类抓包工具,我们可以通过扩展WebClient的逻辑,在请求建立连接后从底层的网络连接中提取本地端点信息。

实现思路

当WebClient完成请求并建立TCP连接后,底层的HttpWebResponse会包含实际的本地连接信息(包括源IP和端口)。我们可以通过重写WebClient的GetWebResponse方法,在连接建立后捕获这个信息并存储到自定义属性中,之后就能直接从实例中读取。

修改后的代码示例

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            List<WebClientEx> li = new List<WebClientEx>();
            li.Add(new WebClientEx() { ipEndPoint = new IPEndPoint(IPAddress.Parse("Source IP Address 1"), 0) });
            li.Add(new WebClientEx() { ipEndPoint = new IPEndPoint(IPAddress.Parse("Source IP Address 2"), 0) });
            li.Add(new WebClientEx() { ipEndPoint = new IPEndPoint(IPAddress.Parse("Source IP Address 3"), 0) });

            foreach (WebClientEx web in li)
            {
                string html = web.DownloadString("https://www.ugtop.com/spill.shtml");
                // 直接读取实际使用的源IP
                if (web.ActualSourceIp != null)
                {
                    Debug.WriteLine($"实际使用的源IP: {web.ActualSourceIp.Address}, 端口: {web.ActualSourceIp.Port}");
                }
                else
                {
                    Debug.WriteLine("未能获取到源IP(可能连接未建立)");
                }
            }
        }
    }

    public class WebClientEx : WebClient
    {
        public IPEndPoint ipEndPoint;
        // 新增属性存储实际使用的源IP
        public IPEndPoint ActualSourceIp { get; private set; }

        public IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) => ipEndPoint;

        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
            request.ConnectionGroupName = ipEndPoint.ToString();
            request.ServicePoint.BindIPEndPointDelegate = BindIPEndPointCallback;
            return request;
        }

        // 重写GetWebResponse,捕获实际的本地端点信息
        protected override WebResponse GetWebResponse(WebRequest request)
        {
            WebResponse response = base.GetWebResponse(request);
            // 从HttpWebResponse中提取本地IP
            if (response is HttpWebResponse httpResponse)
            {
                ActualSourceIp = httpResponse.ServicePoint.Connection?.LocalEndPoint as IPEndPoint;
            }
            return response;
        }
    }
}

关键说明

  • 新增了ActualSourceIp属性,用于存储实际建立连接后的源IP和端口。
  • 重写GetWebResponse方法:当请求得到响应后,从HttpWebResponse的ServicePoint.Connection中提取LocalEndPoint,这就是实际使用的源IP端点。
  • 在foreach循环中,下载完成后直接读取web.ActualSourceIp即可获取到实际使用的源IP,无需额外工具。

注意事项

  • 这个方法需要在请求完成后调用(比如DownloadString执行完毕),因为只有连接建立后才会有有效的本地端点信息。
  • 如果遇到连接复用的情况,ServicePoint可能会保留之前的连接信息,但只要是当前实例发起的请求,获取到的就是本次连接实际使用的源IP。

内容的提问来源于stack exchange,提问作者kyouno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:22