2010-12-06 120 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數據包解析。