如何纠正一个类中产生的进程导致的“每个地址错误只有一个套接字使用”?

问题描述:

目前,我正在尝试开发一个服务器框架,将消息从抽搐传递到本地网络上的其他计算机。我有一个名为服务器的类,下面我有一个简单的例子,它演示了我遇到的问题。问题是twitch_socket正在创建两次并绑定到地址/端口。我的预期结果是套接字将在服务器类的子进程之间共享。我如何修改这个类,甚至完全摆脱它,这样进程就可以在它们之间共享套接字?如何纠正一个类中产生的进程导致的“每个地址错误只有一个套接字使用”?

import multiprocessing 
import socket 
import re 
from BotPass import PASSWORD 
def send_message(socketobj, message): 
    'Sends a str as bytes through socket' 
    message = message.encode() 
    socketobj.sendall(message) 
def recv_message(socketobj): 
    'Receives a str as bytes though socket' 
    return socketobj.recv(2048).decode() 
class Server: 
    'Handles receiving messages from twitch and directs messages from clients' 
    twitch_socket = socket.socket() 
    twitch_socket.connect(('irc.chat.twitch.tv', 6667)) 
    send_message(twitch_socket, 'PASS %s\r\n' % (PASSWORD)) 
    send_message(twitch_socket, 'NICK %s\r\n' % ('squid_coin_bot')) 
    send_message(twitch_socket, 'JOIN #jtv\r\n') 
    send_message(twitch_socket, 'CAP REQ :twitch.tv/commands\r\n') 
    server_socket = socket.socket() 
    server_socket.bind(('', 9999)) 
    work_queue = multiprocessing.Queue() 
    #Queue of messages from twitch 
    worker_queue = multiprocessing.Queue() 
    #Queue of free client socket objects 
    result_queue = multiprocessing.Queue() 
    #Queue of what to send back to twitch 
    def start(): 
     accept_process = multiprocessing.Process(target=Server.accept_connections) 
     # *This is most likely where the issue is occurring* 
     accept_process.daemon = True 
     accept_process.start() 
    def accept_connections(): 
     '' 
     Server.server_socket.listen(10) 
     while 1: 
      (clientsocket, clientaddr) = Server.server_socket.accept() 
      # What I believe I am referencing here is the server socket which is inherent to the Server class 
      if re.match(r'192\.168\.\d{1,3}\.\d{1,3}', clientaddr[0])\ 
      or clientaddr[0] == '127.0.0.1': 
       Server.worker_queue.put(clientsocket) 
      else: 
       clientsocket.close() 
Server.start() 
input() 

输出在控制台:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 105, in spawn_main 
    exitcode = _main(fd) 
    File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 114, in _main 
    prepare(preparation_data) 
    File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 225, in prepare 
    _fixup_main_from_path(data['init_main_from_path']) 
    File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path 
    run_name="__mp_main__") 
    File "C:\Program Files\Python36\lib\runpy.py", line 263, in run_path 
    pkg_name=pkg_name, script_name=fname) 
    File "C:\Program Files\Python36\lib\runpy.py", line 96, in _run_module_code 
    mod_name, mod_spec, pkg_name, script_name) 
    File "C:\Program Files\Python36\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "C:\twitch-market\server.py", line 18, in <module> 
    class Server: 
    File "C:\twitch-market\server.py", line 27, in Server 
    server_socket.bind(('', 9999)) 
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted 

添加此socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 这是因为以前的执行留下了一个TIME_WAIT状态的插座,并不能立即reused.the SO_REUSEADDR标志告诉内核在TIME_WAIT状态下重用本地套接字,而无需等待其自然超时过期。