[網絡編程]python UDP組播轉UDP單播

#!/usr/bin/env python3
# -*- coding: utf8 -*-
# __Author: "JINZHU"
# date: 2019/7/28
import sys
import time
import struct
import socket

ENABLE_TEST_SOCK = False


def udp_forward(recv_eth_name, recv_mcast_group_ip, recv_mcast_group_port,
                send_eth_name, send_dest_ip, send_dest_port):
    recv_sock = socket.socket(
        socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    if "linux" in sys.platform:
        recv_sock.setsockopt(socket.SOL_SOCKET, 25, recv_eth_name)
    recv_sock.bind((recv_mcast_group_ip, recv_mcast_group_port))
    recv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 加入組播組
    mreq = struct.pack("=4sl", socket.inet_aton(
        recv_mcast_group_ip), socket.INADDR_ANY)
    recv_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    send_sock = socket.socket(
        socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    if "linux" in sys.platform:
        send_sock.setsockopt(socket.SOL_SOCKET, 25, send_eth_name)
    send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    if ENABLE_TEST_SOCK:
        send_test_sock = socket.socket(
            socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        if "linux" in sys.platform:
            send_test_sock.setsockopt(socket.SOL_SOCKET, 25, send_eth_name)
        send_test_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    while True:
        if ENABLE_TEST_SOCK:
            send_test_sock.sendto("hello".encode("utf-8"),
                                  (recv_mcast_group_ip, recv_mcast_group_port))

        data, _ = recv_sock.recvfrom(1500)
        print("recv  %s" % data.decode())
        send_sock.sendto(data, (send_dest_ip, send_dest_port))

    recv_sock.close()
    send_sock.close()
    pass


if __name__ == "__main__":

    recv_eth_name = b"wlp8s0"
    recv_mcast_group_ip = "231.0.0.1"
    recv_mcast_group_port = 7001

    send_eth_name = b"wlp8s0"
    send_dest_ip = "192.168.1.4"
    send_dest_port = 5000
    udp_forward(recv_eth_name, recv_mcast_group_ip, recv_mcast_group_port,
                send_eth_name, send_dest_ip, send_dest_port)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章