【问题标题】:how to change originating IP in HttpWebRequest如何更改 HttpWebRequest 中的原始 IP
【发布时间】:2013-08-18 00:42:09
【问题描述】:

我在分配了 5 个 IP 的服务器上运行此应用程序。我使用 HttpWebRequest 从网站获取一些数据。但是当我建立连接时,我能够指定从 5 个 IP 中的哪一个建立连接。 HttpWebRequest 支持这个吗?如果不能,我可以从它继承一个类来改变它的行为吗?我需要这样的想法。

我现在的代码是这样的:

System.Net.WebRequest request = System.Net.WebRequest.Create(link);
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
    StreamReader sr = new StreamReader(response.GetResponseStream());
    return sr.ReadToEnd();
}

【问题讨论】:

  • 请重新格式化一下,这样代码更容易阅读。
  • 对不起。我贴了,论坛就是这样贴的。不知道为什么。现在应该好多了。
  • 谢谢。我明白它是怎么回事:)

标签: c# httpwebrequest ip webrequest


【解决方案1】:

根据this,没有。您可能不得不使用 Sockets,我知道您可以选择本地 IP。

编辑:实际上,这似乎是可能的。 HttpWebRequest 有一个 ServicePoint 属性,该属性又具有BindIPEndPointDelegate,这可能就是你要找的。​​p>

等一下,我来举个例子……

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com");

req.ServicePoint.BindIPEndPointDelegate = delegate(
    ServicePoint servicePoint,
    IPEndPoint remoteEndPoint,
    int retryCount) {

    if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) {
        return new IPEndPoint(IPAddress.IPv6Any, 0);
    } else {
        return new IPEndPoint(IPAddress.Any, 0);
    }

};

Console.WriteLine(req.GetResponse().ResponseUri);

基本上,委托必须返回一个 IPEndPoint。你可以选择任何你想要的,但如果它不能绑定到它,它会再次调用委托,最多 int.MAX_VALUE 次。这就是我包含处理 IPv6 的代码的原因,因为 IPAddress.Any 是 IPv4。

如果您不关心 IPv6,则可以摆脱它。另外,我将 IPAddress 的实际选择留给读者作为练习:)

【讨论】:

  • 那个家伙想欺骗 IP。他想使用他不拥有的IP。在我的情况下,这些 IP 列在我的网络接口上。
  • 思路是一样的。但是,看起来您需要的是可能的......我已经编辑了我的答案以反映这一点,我正在创建一个示例/测试它......
  • 好的,我已经添加了一个示例。 :D
  • +1 有趣。我试过了,因为它不能被绑定,所以它会在一个循环中转来转去。以为你可以选择随机 IP - 猜不到
  • BritishDeveloper,你不能随意选择任何IP。它必须是连接到您的计算机的适配器的 IP 地址。如果你一直选择一个它无法绑定的 IP 地址,那么它会一直调用代理。解决方案是使用 IPAddress.Any(或 IPV6 等效项),或枚举设备以找到您可以使用的设备。 (我推荐前者)
【解决方案2】:

试试这个:

System.Net.WebRequest request = System.Net.WebRequest.Create(link);
request.ConnectionGroupName = "MyNameForThisGroup"; 
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
    StreamReader sr = new StreamReader(response.GetResponseStream());
    return sr.ReadToEnd();
}

然后尝试将 ConnectionGroupName 设置为您希望使用的每个源 ip 不同的名称。

编辑:将其与上述答案中的 IP 绑定委托结合使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2017-02-16
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2017-06-23
    • 2011-04-08
    相关资源
    最近更新 更多