【问题标题】:address already in use with multithreaded server in twisted已在扭曲的多线程服务器中使用的地址
【发布时间】:2010-12-06 13:12:53
【问题描述】:

我正在尝试使用 twisted 在 python 中编写多线程服务器。 callInThread(self.task) 是在客户端每次向服务器请求某事时创建一个新线程来运行 task()。当客户端一个一个发送请求时(全部通过端口53),一切正常,但是当同时有多个请求时,它说

文件“”,第 1 行,在绑定中 socket.error: [Errno 98] 地址已在使用中

我的线程有问题吗,一次只能使用一个端口?如果是这样,我应该如何处理我的服务器的多线程? 非常感谢!

class BaseThreadedUDPServer(DatagramProtocol):
    def datagramReceived(self, datagram, (host, port)):
        print "received %r from %s:%d" % (datagram, host, port)
        reactor.callInThread(self.task)

    def task(a):
        print "waiting on port:", csport
        while 1:
            ## RCV QUERY ##
            query, addr = csSocket.recvfrom(csbuf)
            ## GET ANS ##
            ans = socket.gethostbyname(query)
            ## SEND ANS ##
            scSocket.sendto(ans, scaddr)

def main():
    print "main"
    reactor.listenUDP(53, BaseThreadedUDPServer())
    reactor.run()

【问题讨论】:

  • @pilu: 好像你根本没有被扭曲......你不需要线程来并行做事,事实上你应该完全避免它们。
  • 什么意思?你不需要线程来并行运行吗?
  • 基本上:是的。但是(一个扭曲的用户)需要线程吗?不,twisted 会照顾他们。

标签: python multithreading twisted


【解决方案1】:

您不需要线程。这是可怕的错误。 Twisted 已经在为您调用recv:这是传递给datagramReceived 的结果。不要自己再调用它。你不需要线程。

但是,这可能与您的问题无关。 53 是默认的 DNS 端口:您遇到的问题是另一台服务器,可能是 DNS 服务器已经在该计算机上运行。尝试将 53 更改为其他值。

但我不太确定;将来,请粘贴完整的回溯。该回溯行显然不是来自您粘贴的示例,因为第 1 行除了“类”语句之外没有任何内容。此外,由于此代码缩进错误并引发了SyntaxError,因此它显然与您正在运行的代码不完全相同。

假设您实际上是在使用 DNS,Twisted 有自己的 DNS 服务器;您应该使用twisted.names 而不是实现自己的 DNS 数据包解析。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多