Twisted:出站连接的源IP地址

2024-09-27 20:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个服务——使用Twisted框架用Python编写,运行在DebianGNU/Linux上——它检查SIP服务器的可用性。为此,我使用OPTIONS方法(SIP协议特性),因为这似乎是一种常见的做法。为了构造正确的和RFC兼容的报头,我需要知道要建立的连接的源IP地址和源端口。[如何]Twisted能做到这一点?在

这就是我所尝试的: 我子类化了protocol.DatagramProtocol,并在{}中使用了self.transport.getHost().host和{}。后者确实是将要使用的端口,而前者只产生0.0.0.0。在

我想现在Twisted还没有?]知道将使用哪个接口以及哪个源IP地址。Twisted是否提供了一个可以帮助我实现这一点的工具,还是需要以不同的方式与操作系统(路由)进行接口?或者我只是不正确地使用了self.transport.getHost().host?在


Tags: 方法端口self服务器框架host协议linux
3条回答

你有没有看到,你想做的事,是不是可以与SIP实现,这是扭曲的一部分?在

在任何情况下,在Twisted中为UDP设置源地址和端口的方式与不使用Twisted的设置方式非常相似。在Twisted中,reactor.listenUDP(port, protocol, interface)将UDP套接字绑定到特定的端口和接口,并将接收到的数据报处理为协议。在协议内部,self.transport.write(msg, addr)使用协议绑定到的地址作为源地址向addr发送一个数据报。在

再读一遍你的问题,我想你唯一遗漏的部分就是把interface传递给reactor.listenUDP(...)。在

为了完整起见,我回答了我自己的问题:

在尝试确定主机的源IP地址之前,请确保在传输上使用connect()。以下摘录显示了协议实现的相关部分:

class FooBarProtocol(protocol.DatagramProtocol):
    def startProtocol(self):
        self.transport.getHost().host   # => 0.0.0.0
        self.transport.connect(self.dstHost, self.dstPort)
        self.transport.getHost().host   # => 192.168.1.102

如果使用UDP,则端点由以下任一项确定:

  1. 在套接字上调用bind(),并显式地给它一个地址
  2. 发送数据包

如果你想要更多的细节,check this response。在

问题是我对twisted不太熟悉。从我快速阅读资料中可以看出,您可能希望使用^{}这样的反应堆。这就是^{} does under the hood。在

如果将twisted从图片中取出,则下面的片段将显示发生了什么:

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
<socket._socketobject object at 0x10025d670>
>>> s.getsockname()           # this is an unbound or unnamed socket
('0.0.0.0', 0)
>>> s.bind( ('0.0.0.0', 0) )  # 0.0.0.0 is INADDR_ANY, 0 means pick a port
>>> s.getsockname()           # IP is still zero, but it has picked a port
('0.0.0.0', 56814)

如果需要支持多个网络接口或IPv4和IPv6,那么获取主机名有点麻烦。如果可以使使用的接口可配置,那么将其作为元组的第一个成员传递给socket.bind(),这样就设置好了。在

现在最困难的部分是在twisted提供的抽象范围内完成这项工作。不幸的是,我在那帮不了什么忙。我建议您寻找有关如何访问底层套接字或找到将套接字信息传递到框架中的方法的示例。在

祝你好运。在

相关问题 更多 >

    热门问题