[网络编程]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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值