#!/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)