2016-07-21 4 views
0

ich eine statische DNS mit dem Namen vops-server.com, die zu meinem Dell Power Punkte 2950. Auf dieser 2950 betreibe ich die server.py, die zunächst an tcp://0.0.0.0:7777 bindet und leitet anschließend alle eingehenden Kunden ein Sockel, der an einen Port größer als 7777 gebunden ist, von denen der erste 7778 ist. Dieses neu erzeugte ROUTER-DEALER Paar einfach Echo "Hello, world!".ZeroMQ ROUTER-HÄNDLER an einen anderen Router-HÄNDLER Ausgabe umleiten

Der Dell Poweredge 2950 arbeitet Ubuntu 16.04.1 LTS und nicht den Code ordnungsgemäß ausgeführt wird, die folgenden auf einem KeyboardInterrupt ausgibt:

k▒Eg 
Listening on port 7778 
Recv 
Resource temporarily unavailable 
Client on port 7778 disconnected 
^CProcess Process-3: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "test_server.py", line 76, in worker_task 
    data = worker_socket.recv_multipart() 
    File "/usr/local/lib/python2.7/dist-packages/zmq/sugar/socket.py", line 395, in recv_multipart 
    parts = [self.recv(flags, copy=copy, track=track)] 
    File "zmq/backend/cython/socket.pyx", line 693, in zmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:7283) 
    File "zmq/backend/cython/socket.pyx", line 727, in zmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:7081) 
    File "zmq/backend/cython/socket.pyx", line 145, in zmq.backend.cython.socket._recv_copy (zmq/backend/cython/socket.c:2033) 
    File "zmq/backend/cython/checkrc.pxd", line 12, in zmq.backend.cython.checkrc._check_rc (zmq/backend/cython/socket.c:7522) 
    PyErr_CheckSignals() 
KeyboardInterrupt 

Während der Client gibt der folgende:

Connecting to distribution server tcp://vops-server.com:7777 
[Dist] Send 
[Dist] Recv 
[Dist] 7778 
Connecting to host tcp://vops-server.com:7778 
[Host] Send 
[Host] Recv 

An diesem Punkt der Client soll eine letzte Zeile von [Host] Hello, world! ausgeben, aber es wartet darauf, eine Nachricht zu erhalten. Jetzt

, auf meinem Laptop, die Windows 10 Home 1511 arbeitet, wird die Ausgabe wie erwartet:

Ç ) 
Listening on port 7778 
Recv 
['\x00\x80\x00\x00)', 'Hello, world!'] 
Sent 

Mit jetzt den Client richtig ausgibt:

Connecting to distribution server tcp://vops-server.com:7777 
[Dist] Send 
[Dist] Recv 
[Dist] 7778 
Connecting to host tcp://vops-server.com:7778 
[Host] Send 
[Host] Recv 
[Host] Hello, world! 

Bitte lesen Sie den Code unten.

server.py:

import sys 
import zmq 
from multiprocessing import Process, Queue, Array, Value 
import time 

def server_task(): 
    port_base = 7777 

    server_context = zmq.Context.instance() 

    server_socket = server_context.socket(zmq.ROUTER) 

    server_socket.bind("tcp://0.0.0.0:%d" % (port_base,)) 

    timeout_queue = Queue() 
    port_list = [ 1 ] 

    proc_list = [ ] 

    while True: 
     try: 
      client_id = server_socket.recv_multipart()[0] 

      print(client_id) 

      # Get an unused port from the list 
      # Ports from clients that have timed out are recycled here 

      while not timeout_queue.empty(): 
       port_list.append(timeout_queue.get()) 

      port_offset = port_list.pop() 

      if len(port_list) == 0: 
       port_list.append(port_offset + 1) 

      # Spawn a new worker task, binding the port to a socket 

      proc_running = Value("b", True) 

      proc_list.append(proc_running) 

      Process(target=worker_task, args=(proc_running, port_base, port_offset, timeout_queue)).start() 

      # Send the new port to the client 

      server_socket.send_multipart([client_id, str(port_base + port_offset)]) 

     except KeyboardInterrupt: 
      break 

    for proc_running in proc_list: 
     proc_running.value = False 

    server_socket.close() 
    server_context.term() 

def worker_task(proc_running, port_base, port_offset, timeout_queue): 
    port = port_base + port_offset 

    print("Listening on port %d" % (port,)) 

    worker_context = zmq.Context.instance() 

    worker_socket = worker_context.socket(zmq.ROUTER) 

    worker_socket.setsockopt(zmq.RCVTIMEO, 5000) 
    worker_socket.bind("tcp://0.0.0.0:%d" % (port,)) 

    while proc_running.value: 
     try: 
      print("Recv") 
      data = worker_socket.recv_multipart() 

      print(data) 
      worker_socket.send_multipart(data) 

      print("Sent") 
     except zmq.ZMQError as e: 
      print(e) 
      break 

    print("Client on port %d disconnected" % (port,)) 

    timeout_queue.put(port_offset) 

    worker_socket.close() 
    worker_context.term() 

if __name__ == "__main__": 
    server_task() 

client.py:

import os 
import io 
import time 
import zmq 
from multiprocessing import Process 

def connect_to_host(context, host, port, timeout): 
    address = ("tcp://%s:%s" % (host, port)) 

    socket = context.socket(zmq.DEALER) 

    socket.setsockopt(zmq.RCVTIMEO, timeout) 
    socket.connect(address) 

    print("Connecting to distribution server %s" % (address,)) 

    while True: 
     try: 
      print("[Dist] Send") 
      socket.send_multipart([str(0)]) 
      print("[Dist] Recv") 
      port = socket.recv_multipart()[0] 
      print("[Dist] %s" % (port,)) 

      break 
     except zmq.Again: 
      socket.close() 

      socket = context.socket(zmq.DEALER) 

      socket.setsockopt(zmq.RCVTIMEO, timeout) 
      socket.connect(address) 

      print("Connecting to distribution server %s" % (address,)) 

    socket.close() 

    address = ("tcp://%s:%s" % (host, port)) 

    socket = context.socket(zmq.DEALER) 

    socket.setsockopt(zmq.RCVTIMEO, timeout) 
    socket.connect(address) 

    print("Connecting to host %s" % (address,)) 

    return socket 

def client_task(client_type): 
    timeout = 5000 
    host = "vops-server.com" 
    port = "7777" 

    context = zmq.Context().instance() 

    socket = connect_to_host(context, host, port, timeout) 

    while True: 
     try: 
      try: 
       print("[Host] Send") 
       socket.send_multipart(["Hello, world!"]) 

       print("[Host] Recv") 
       data = socket.recv_multipart()[0] 

       print("[Host] %s" % (data,)) 
      except zmq.Again: 
       socket.close() 

       socket = connect_to_host(context, host, port, timeout) 

     except KeyboardInterrupt: 
      break 

    print("Connection terminated") 

    socket.close() 
    context.term() 

if __name__ == "__main__": 
    client_task(0) 

Ich kann unmöglich verstehen, warum der gleiche Code auf der einen Maschine arbeitet und das andere nicht; Ich habe überlegt, Windows Server 2012 auf dem Dell PowerEdge 2950 zu installieren. Ich hoffe, dass der Fehler im Betriebssystem und nicht in der Hardware selbst liegt. Für den Moment warte ich und hoffe, dass ein Experte irgendwo die Lösung für mein Problem hat.

Antwort

0

Derselbe Code funktioniert auch auf dem Dell PowerEdge 2950 mit Windows Server 2012 R2. ZMQ scheint Probleme mit Ubuntu zu haben.

Verwandte Themen