2010-12-06 70 views
1

我想在Python中使用扭曲编写多线程服务器。 callInThread(self.task)是每次客户端从服务器请求时创建一个新线程来运行task()。当客户端发送请求一一(全部通过53端口),一切正常,但是当有在同一时间多个请求,它说地址已经在使用扭曲的多线程服务器

File "", line 1, in bind socket.error: [Errno 98] Address already in use

有某事错了我的线程,只有一个可以使用港口一次?如果是这样,我应该如何处理多线程服务器? 非常感谢!

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() 
+0

@pilu:看起来好像你根本不会扭曲......你并不需要线程来并行处理事实,事实上你应该完全避免它们。 – 2010-12-06 13:24:47

回答

2

你不需要线程。这是可怕的越野车。 Twisted已经为你调用了recv:这是传递给datagramReceived的结果。不要再自己调用它。你不需要线程。

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

但我不太确定;未来,请贴上完整的追溯。这条追溯线显然不是来自您粘贴的示例,因为除了'class'语句外,第1行没有任何内容。此外,由于此代码缩进并产生了SyntaxError,因此显然与您正在运行的代码不完全相同。

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