我正在尝试用python编写一个使用twisted的多线程服务器。卡林思(自我任务)创建一个新线程,以在每次客户端从服务器请求某事物时运行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()
你不需要线程。这是可怕的马车。Twisted已经在为您调用
recv
:它是传递给datagramReceived
的结果。你自己别再叫了。你不需要线。在然而,这可能与你的问题无关。53是默认的DNS端口:问题是另一台服务器,可能是一台DNS服务器已经在该计算机上运行。尝试将53更改为其他值。在
但我不太确定,以后请粘贴完整的回溯。回溯行显然不是来自您粘贴的示例,因为第1行除了“class”语句之外没有其他内容。另外,由于这段代码缩进错误并引发一个
SyntaxError
,它显然与您正在运行的代码不完全相同。在假设您实际在使用DNS,Twisted有自己的DNS服务器;您应该使用^{} 而不是实现自己的DNS包解析。在
相关问题 更多 >
编程相关推荐