【问题标题】:Binding outgoing IP address for every connection made by Python interpreter为 Python 解释器建立的每个连接绑定传出 IP 地址
【发布时间】:2011-05-21 11:58:25
【问题描述】:

我需要将一个用 Python 编写的简单脚本嵌入到我的 C 应用程序中。该脚本只是从 Internet 下载一些内容,对其进行解析并将结果打印到标准输出中。我需要绑定脚本建立的每个连接的传出 IP 地址,以使用服务器提供的许多 IP 地址。我可以使用 Python/C API 或 C system()/execve() 函数。我更喜欢不修改脚本本身,因为它使用不支持直接绑定本地 IP 的 liburl2。

我会很感激每一个提示。

问候, 迈克尔·彼得拉斯。

【问题讨论】:

  • 不知道“我需要绑定脚本建立的每个连接的传出 IP 地址,以使用服务器提供的许多 IP 地址”应该是什么意思
  • 你的意思是'利用一个多个IP地址...'?
  • @sentinel @Johnsywe 我的服务器在一个接口上有几个 IP。我需要能够从这些地址建立传出连接,因为脚本要求的服务器上的单个 IP 地址的连接存在限制。
  • @Sentinel 我已经阅读了它,但我想在解释器级别进行,以避免编辑源代码。有没有办法为解释器建立的所有连接绑定本地 IP?

标签: python c unix network-programming


【解决方案1】:

您的问题在这里得到解答:Source interface with Python and urllib2

【讨论】:

  • 我已经阅读了它,但我想在解释器级别进行以避免编辑源代码。有没有办法为解释器建立的所有连接绑定本地 IP?
  • 要从 python 外部执行此操作,您需要拦截对 bind() 的调用:编写一个实现 bind() 并安装为 LD_PRELOAD 的 C 包装器,更改 bind 系统调用的参数,并将请求转发给真正的绑定函数。与参考答案中给出的解决 urllib2 限制的工作相比,它似乎需要更多的工作。
  • 非常感谢。我希望我可以更轻松地完成它。我使用的脚本有点复杂,而且我不是 Python 程序员。这是否适用于 urllib2 需要在脚本连接的任何地方进行修改,或者我只能执行一次?
  • 给定补丁urllib2的代码。执行后,所有后续调用都将受益于补丁。
【解决方案2】:

您可以在不编辑 python 源代码的情况下设置传出 IP 地址,只需在运行嵌入式代码之前在解释器中执行 here 中描述的字符串作为字符串。像这样的东西会起作用:

#include <Python.h>

int main(int argc, char *argv[]) {
  Py_SetProgramName(argv[0]);
  Py_Initialize();
  PyRun_SimpleString
    ("import socket\n"
     "true_socket = socket.socket\n"
     "def bound_socket(*a, **k):\n"
     "    sock = true_socket(*a, **k)\n"
     "    sock.bind((127.0.0.1, 0))\n"
     "    return sock\n"
     "socket.socket = bound_socket\n");

  // Run embedded code here

  Py_Finalize();
  return 0;
}

当然,您可以将 127.0.0.1 替换为正确的源 IP 地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2012-06-15
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多