Score:0

สร้างตัวส่งต่อ UDP ที่เลียนแบบองค์ประกอบเครือข่ายหลายรายการที่ใช้พอร์ตเดียวกัน

ธง de

ที่ให้ไว้:

  • ฉันมีบริการคอนเทนเนอร์ที่ส่งแพ็กเก็ต UDP ไปยังรายการองค์ประกอบเครือข่าย (เซิร์ฟเวอร์ซิงก์ syslog ของบุคคลที่สาม)
  • องค์ประกอบเครือข่ายเป้าหมายแต่ละรายการระบุโดยที่อยู่ IP หมายเลขพอร์ตเป็นค่าคงที่ เหมือนกันสำหรับแต่ละโหนด

ฉันต้องสร้างสภาพแวดล้อมการทดสอบอย่างง่าย - เหมือนในกราฟด้านล่าง บริการหลักส่งข้อความ syslog บนกราฟเป็นชื่อ คอนเทนเนอร์ผู้ผลิต.

ภาชนะทดสอบ สามารถวางไข่ของ docker container ได้ง่าย ดังนั้นฉันจึงเลือกวางไข่ อัลไพน์/โซกัต: ล่าสุด.

คำถามคือ:

  1. ฉันต้องส่งข้อโต้แย้งอะไรบ้าง โซแคท เพื่อให้การติดตั้งใช้งานได้?
  2. ฉันต้องดูแลอะไรอีก

ฉันลองชุดค่าผสมมากมาย โซแคท หาเรื่องจนถึงตอนนี้ แต่ไม่มีโชค กับ socat UDP-RECV:514 UDP-SENDTO:172.25.0.2:65354,bind=:1234 ฉันได้รับข้อความในคอนเทนเนอร์พร็อกซี แต่ไม่ได้รับข้อความในคอนเทนเนอร์ทดสอบ

ดูเหมือนว่าฉันขาดความรู้โดยรวม มีใครอธิบายได้บ้างว่ามันควรจะทำอย่างไร?

test_environment

รหัสที่ฉันใช้ในคอนเทนเนอร์ทดสอบนั้นมีลักษณะดังนี้:

นำเข้าระบบปฏิบัติการ
แพลตฟอร์มนำเข้า
เกลียวนำเข้า
จากซ็อกเก็ตนำเข้าซ็อกเก็ต

นำเข้านักเทียบท่า
จากนักเทียบท่านำเข้า DockerClient
จาก docker.models.containers นำเข้าคอนเทนเนอร์
จาก docker.models.networks นำเข้าเครือข่าย


def create_proxy():
    นักเทียบท่า_client: นักเทียบท่าไคลเอ็นต์ = นักเทียบท่า.จาก_env()
    test_network: เครือข่าย = docker_client.networks.create(f'test_network_{os.environ.get("HOSTNAME")}')
    testrunner_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 (ซ็อกเก็ต AF_INET, socket.SOCK_DGRAM)
    socket_.bind(('', 0)) # ผูกกับพอร์ตในเครื่องแบบสุ่ม
    _, 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: คอนเทนเนอร์ = docker_client.containers.run(
        'อัลไพน์/โซกัต:ล่าสุด',
        socat_args,
        ชื่อ='udp_proxy_container'
        เครือข่าย = test_network.name
        detach=จริง,
        ลบ=จริง
    )
    proxy_container.reload()
    proxy_ip = proxy_container.attrs['NetworkSettings']['Networks'][test_network.name]['IPAddress']

    socket_ = socket.socket (ซ็อกเก็ต AF_INET, socket.SOCK_DGRAM)
    socket_.bind(('', 0)) # ผูกกับพอร์ตในเครื่องแบบสุ่ม

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

    def รับ_loop (คิว):
        ในขณะที่ทรู:
            พยายาม:
                ข้อความ = socket_.recv (1024)
                ถ้า b'STOP IT' ในข้อความ:
                    หยุดพัก
                คิวต่อท้าย (ข้อความ)
            ยกเว้น socket.timeout เป็น e:
                log.error(f"{type(e).__name__} ในลูปรับของ Syslog stub: {e}")

    msg_queue = []
    receiver_thread = threading.Thread(target=receive_loop, args=(msg_queue,))
    receiver_thread.daemon = จริง
    receiver_thread.start()

    # ... รหัสอื่น ๆ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา