Puncte:0

Creați expeditori UDP care imit mai multe elemente de rețea care folosesc același port

drapel de

Dat:

  • Am un serviciu containerizat care trimite pachete UDP către o listă de elemente de rețea (servere syslog sink terțe).
  • Fiecare element de rețea țintă este specificat de adresa IP, numărul său de port este constant, același pentru fiecare nod.

Trebuie să creez un mediu de testare simplu - ca în graficul de mai jos. Serviciul principal emite mesaje syslog, pe grafic este numit PRODUCATOR CONTAINER.

CONTAINER DE TESTARE poate genera cu ușurință containere docker, așa că am ales reproducerea alpin/socat:latest.

Întrebarea este:

  1. La ce argumente trebuie să trec socat pentru ca setarea să funcționeze?
  2. De ce altceva trebuie să-mi pese?

Am încercat multe combinații de socat argumente până acum, dar fără noroc. Cu socat UDP-RECV:514 UDP-SENDTO:172.25.0.2:65354,bind=:1234 Primesc mesaje în containerele proxy, dar nu se primește nimic în containerul de testare.

Se pare că îmi lipsesc cunoștințele generale. Poate cineva să explice cum ar trebui să se facă?

mediu de testare

Codul pe care îl folosesc în containerul de testare arată mai mult, mai puțin așa:

import os
platforma de import
import threading
din socket import socket

docker de import
din docker import DockerClient
din docker.models.containers import Container
din docker.models.networks import Network


def create_proxy():
    docker_client: DockerClient = docker.from_env()
    test_network: Network = docker_client.networks.create(f'test_network_{os.environ.get("HOSTNAME")}')
    testrunner_container: Container = docker_client.containers.get(platform.node())

    testrunner_container.reload()
    test_container_ip = testrunner_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']

    socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    socket_.bind(('', 0)) # se leagă la portul local aleatoriu
    _, test_container_port = socket_.getsockname()
    proxy_port = 1234
    socat_args = [
        '-d', '-d', f'UDP-RECV:514', f'UDP-SENDTO:{test_container_ip}:{test_container_port},bind=:{proxy_port}',
    ]

    proxy_container: Container = docker_client.containers.run(
        „alpin/socat:latest”,
        socat_args,
        name='udp_proxy_container',
        network=test_network.name,
        detașează=Adevărat,
        remove=Adevărat,
    )
    proxy_container.reload()
    proxy_ip = proxy_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']

    socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    socket_.bind(('', 0)) # se leagă la portul local aleatoriu

    socket_.connect((proxy_ip, proxy_port))
    socket_.settimeout(1)

    def receive_loop(coada):
        în timp ce este adevărat:
            încerca:
                mesaj = socket_.recv(1024)
                dacă b'OPRITĂ-L' în mesaj:
                    pauză
                queue.append(mesaj)
            cu excepția socket.timeout ca e:
                log.error(f"{type(e).__name__} în bucla de primire a stub-ului Syslog: {e}")

    msg_queue = []
    receive_thread = threading.Thread(target=receive_loop, args=(msg_queue,))
    receive_thread.daemon = Adevărat
    receive_thread.start()

    # ... alt cod

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.