线程UDP套接字

时间:2014-12-19 08:59:36

标签: python multithreading sockets udp

我正在尝试用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;

我使用这个是因为我希望能够与客户做一些特殊的事情,但也能够同时连接新客户。

1 个答案:

答案 0 :(得分:0)

首先,不要使用SO_REUSEADDR。有legitimate uses of SO_REUSEADDR,但在大多数简单情况下它没用,它隐藏了真正的问题。如果需要,可以随意重新添加它,但只有当你的程序没有它时才能重新添加。

您的问题出在main。你循环了参数的数量,但从不递增i,所以它无限循环。此外,您始终在测试argv[1]。如果有4个参数,而第2个是&#39; -b&#39;,则会调用broker() 4次,这显然不起作用。另请注意,如果您的循环结束并且主要退出,您的程序将立即终止,因此您至少应该在最后添加while(True): sleep(5),但它不是解决方案。