扭曲的多线程服务器已经使用的地址

时间:2010-12-06 13:12:54

标签: python multithreading twisted

我正在尝试使用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()

1 个答案:

答案 0 :(得分:2)

你不需要线程。这是可怕的马车。 Twisted已经为你调用了recv:它是传递给datagramReceived的结果。不要自己再打电话。你不需要一个帖子。

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

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

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