gpt4 book ai didi

python - 线程UDP套接字

转载 作者:行者123 更新时间:2023-12-03 11:55:40 25 4
gpt4 key购买 nike

我正在尝试使用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()

它始终打印“[Errno 48]地址已在使用中”

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

最佳答案

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

您的问题出在main中。您正在循环使用参数的数量,但是从不增加i,因此它会无限循环。另外,您始终在测试argv[1]。如果有4个参数,第二个为'-b',则您将调用broker() 4次,这显然不起作用。另外,请注意,如果循环结束并退出主程序,则程序将立即终止,因此至少应在末尾添加while(True): sleep(5),但这不是解决方案。

关于python - 线程UDP套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com