我正在尝试用python创建一个多线程udp服务器。
这是我正在做的事情:
#!/usr/bin/python
# -*- coding:Utf-8 -*-
import sys
import socket
from thread import start_new_thread
class Broker():
def __init__(self, ip, port):
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.ip = ip
self.port = port
self.s.bind((ip, port))
self.listclients = []
def listenMod(b):
dic = {}
msg, ip = b.s.recvfrom(1024)
dic[msg] = ip
b.listclients.append(dic)
print msg, " is connected."
def broker(arg):
try:
b = Broker(arg[2], int(arg[3]))
start_new_thread(listenMod, (b, ))
except Exception, e:
print e
sys.exit(-1)
def client(arg):
try:
pass
except:
pass
def usage():
print "usage ./udps.py <-b|-c> <args>"
print "-b\tserver mode\n\t<args>: host port"
sys.exit()
def main():
i = 1
if len(sys.argv) > 1:
while i < len(sys.argv):
if sys.argv[1] == "-b":
broker(sys.argv)
elif sys.argv[1] == "-c":
pass
else:
usage()
else:
usage()
if __name__ == '__main__':
main()
它始终打印&#34; [Errno 48]地址已在使用&#34;
我使用这个是因为我希望能够与客户做一些特殊的事情,但也能够同时连接新客户。
答案 0 :(得分:0)
首先,不要使用SO_REUSEADDR
。有legitimate uses of SO_REUSEADDR
,但在大多数简单情况下它没用,它隐藏了真正的问题。如果需要,可以随意重新添加它,但只有当你的程序没有它时才能重新添加。
您的问题出在main
。你循环了参数的数量,但从不递增i
,所以它无限循环。此外,您始终在测试argv[1]
。如果有4个参数,而第2个是&#39; -b&#39;,则会调用broker()
4次,这显然不起作用。另请注意,如果您的循环结束并且主要退出,您的程序将立即终止,因此您至少应该在最后添加while(True): sleep(5)
,但它不是解决方案。