目次
質問内容
ホームページ バックエンド開発 Golang Linuxのgolangでマルチキャストが機能しない

Linuxのgolangでマルチキャストが機能しない

Feb 10, 2024 pm 04:42 PM
Linux オペレーティング システム

多播在 golang 中的 Linux 上不起作用

php エディタの Xinyi さん、今日お話したいのは、golang のマルチキャストが Linux 上で動作しないという問題です。マルチキャストは、単一の送信者と複数の受信者の間でデータを送信するネットワーク通信の方法です。ただし、golang では、Linux オペレーティング システムでマルチキャストが機能しない状況に遭遇することがあります。この記事では、この問題が発生する理由と考えられる解決策を説明します。はじめましょう!

質問内容

このコードはマルチキャストパケットを送受信します。

このコードは Windows 10 では動作しますが、Linux では動作しません。なぜですか?

パッケージ化されたコンテンツ (IP 230.0.0.1、宛先ポート 9001) が送信されましたが、マルチキャストはアプリケーションによって受信されませんでした

パケット (ip 230.0.0.2、宛先ポート 9002)。

###何が問題ですか?

アプリケーションをテストするために、Linux VM を使用しました。おそらく、それが理由でしょうか?

package main

import (
    "net"
    "os"
    "strconv"
    "time"

    "github.com/rs/zerolog"
    "golang.org/x/net/ipv4"
)

const device1_tx_multicastAddr = "230.0.0.1"
const device1_tx_udp_port = 9001
const device2_tx_multicastAddr = "230.0.0.2"
const device2_tx_udp_port = 9002
const packetTxDelayMs = 1000

// const ethName = "Ethernet" // Windows
const ethName = "eth0" // Linux

const modeDevice2 = false // Device 1
//const modeDevice2 = true // Device 2

var logConsole zerolog.Logger

func main() {
    logConsole = zerolog.New(os.Stderr).With().Timestamp().
        Str("module", "main").
        Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr}).
        Level(zerolog.InfoLevel)

    // **********************************
    // Initialize Tx
    localInterface := getInterfaceByName(ethName)
    logConsole.Info().Str("func", "main").Msg("localInterface: " + ethName)

    tx_multicastAddr := device1_tx_multicastAddr
    rx_multicastAddr := device2_tx_multicastAddr
    tx_udp_port := device1_tx_udp_port
    rx_udp_port := device2_tx_udp_port

    if modeDevice2 {
        tx_multicastAddr = device2_tx_multicastAddr
        rx_multicastAddr = device1_tx_multicastAddr
        tx_udp_port = device2_tx_udp_port
        rx_udp_port = device1_tx_udp_port
    }

    logConsole.Info().Str("func", "main").Msg("Open Tx UDP port " + tx_multicastAddr + ":" + strconv.Itoa(tx_udp_port) + "...")
    remoteDeviceUdpAddr, err := net.ResolveUDPAddr("udp4", tx_multicastAddr+":"+strconv.Itoa(tx_udp_port))
    if err != nil {
        panic(err)
    }

    localDeviceUdpAddr, err2 := net.ResolveUDPAddr("udp4", localInterface.String()+":"+strconv.Itoa(rx_udp_port))
    if err2 != nil {
        panic(err2)
    }

    logConsole.Info().Str("func", "main").Msg("Listen UDP: " + localDeviceUdpAddr.String() + "...")
    localDevice, err2 := net.ListenUDP("udp4", localDeviceUdpAddr)
    if err2 != nil {
        panic(err2)
    }

    // **********************************
    // Initialize Rx
    udpReceiver := ipv4.NewPacketConn(localDevice)
    ief, errInterface := net.InterfaceByName(ethName)
    if errInterface != nil {
        localDevice.Close()
        panic(errInterface)
    }
    logConsole.Info().Str("func", "main").Msg("Join Multicast: " + rx_multicastAddr + "...")
    err = udpReceiver.JoinGroup(ief, &net.UDPAddr{IP: net.ParseIP(rx_multicastAddr)})

    if err != nil {
        localDevice.Close()
        panic(err)
    }

    // **********************************
    // Run Rx/Tx tasks
    go sendData(localDevice, remoteDeviceUdpAddr, packetTxDelayMs)
    receivedData(udpReceiver)
}

// *************************************************
func sendData(localDevice *net.UDPConn, remoteDeviceUdpAddr *net.UDPAddr, packetDelay uint) {
    data := []byte("1234567890")

    for {
        //logConsole.Info().Str("func", "sendData").Msg("Send...")
        _, err := localDevice.WriteTo(data, remoteDeviceUdpAddr)
        if err != nil {
            panic(err)
        }
        time.Sleep(time.Duration(packetDelay) * time.Millisecond)
    }
}
func receivedData(receiver *ipv4.PacketConn) {
    buf := make([]byte, 1500)
    for {
        n, _, _, err := receiver.ReadFrom(buf)
        if err == nil {
            logConsole.Info().Str("func", "receivedData").Msg("Receive Data: " + string(buf[0:n]))
        }
    }
}

// *************************************************
func getInterfaceByName(name string) net.IP {
    ief, err := net.InterfaceByName(name)
    if err != nil {
        panic(err)
    }
    addrs, err := ief.Addrs()
    if err != nil {
        panic(err)
    }

    var ipAddr net.IP
    for _, addr := range addrs {
        ipAddr = addr.(*net.IPNet).IP.To4()
        if ipAddr != nil {
            break
        }
    }
    if ipAddr == nil {
        panic("ipAddr is nil")
    }
    return ipAddr
}
ログイン後にコピー

回避策

次のいずれかの IP アドレスでリッスンするようにアプリケーションを変更すると、Linux および MacOS で実行できるようになります:

    マルチキャスト グループの IP アドレス (質問内の
  • rx_multicastaddr)
  • ワイルドカード アドレス (
  • 0.0.0.0)。
しかし、NIC の IP アドレス (例:

192.168.0.5) をリッスンするときに機能するかどうかは不明です。私のテストと質問の説明に基づくと、Windowsでは動作しますが、LinuxやMacOSでは動作しません。この動作を説明している信頼できる情報源を見つけることができませんでした。

以下は、accept フラグの簡略化されたデモンストレーションです。

デバイス 1 で、次のコマンドを使用して実行します (インターフェイス名をデバイスの名前に置き換えます):

リーリー

デバイス 2 で、次のコマンドを使用して実行します (インターフェイス名をデバイスのインターフェイス名に置き換えます):

リーリー リーリー

以上がLinuxのgolangでマルチキャストが機能しないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

システムの安定性の問題を解決するために Kali Linux ソフトウェアをアンインストールするための完全ガイド システムの安定性の問題を解決するために Kali Linux ソフトウェアをアンインストールするための完全ガイド Mar 23, 2024 am 10:50 AM

この研究は、KaliLinux の侵入テストおよびセキュリティ監査プロセス中に発生する可能性のあるソフトウェアのアンインストール問題の包括的かつ詳細な分析を提供し、システムの安定性と信頼性を確保するためのソリューションに貢献します。 1. ソフトウェアのインストール方法を理解する kalilinux からソフトウェアをアンインストールする前に、まずインストール パスを決定することが重要な手順です。次に、選択されたパスに基づいて、適切なオフロード ソリューションが選択されます。一般的なインストール方法には、apt-get、dpkg、ソース コード コンパイル、その他の形式が含まれます。各戦略には独自の特徴とそれに対応するオフロード手段があります。 2. apt-get コマンドを使用してソフトウェアをアンインストールする KaliLinux システムでは、ソフトウェア パッケージを効率的かつ便利に実行するために、apt-get 機能コンポーネントが広く使用されています。

15分で完了する国産オペレーティングシステムKirin Linuxのインストール完全ガイド 15分で完了する国産オペレーティングシステムKirin Linuxのインストール完全ガイド Mar 21, 2024 pm 02:36 PM

最近、国産オペレーティングシステム「Kirin Linux」が注目を集めていますが、上級コンピュータエンジニアとして技術革新に強い関心を持っている私が、このシステムの導入プロセスを実際に体験してきましたので、その体験をお話しします。インストール手順を実行する前に、関連する手順の準備を十分に整えました。最初のタスクは、最新の Kirin Linux オペレーティング システム イメージをダウンロードして USB フラッシュ ドライブにコピーすることです。次に、64 ビット Linux の場合は、潜在的なインストールの問題に対処するために個人デバイス内の重要なデータがバックアップされていることを確認し、最後に終了します。コンピューターの電源を切り、USB フラッシュドライブを挿入します。インストール インターフェイスに入り、コンピュータを再起動した後、すぐに F12 ファンクション キーを押し、システム ブート メニューに入り、USB 優先ブート オプションを選択します。美しくシンプルな起動画面が目の前に現れます

puppylinux インストール USB ディスク puppylinux インストール USB ディスク Mar 18, 2024 pm 06:31 PM

実際、コンピュータを長期間使用すると、全体的なパフォーマンスは低下傾向を示し、Windows システムへの適応性は低下し続けます。コンピューター自体の理由に加えて、Windows システムは強化および拡張され続けており、ハードウェア要件もますます高くなっています。したがって、Windowsシステムをインストールした後に古いコンピューターに遅延が発生するのは驚くべきことではありません。以前は、多くの友人がバックグラウンドでシステムの遅れについて、古いコンピューターをどうすればよいか尋ねていました。古いコンピューターに新しい Windows 10 システムをインストールすると遅延や操作上の問題が発生する場合は、Linux への切り替えを検討することをお勧めします。 Dabaicai は、古いコンピュータに適した 5 つのマイクロ Linux システムをコンパイルしました。これらは、CPU 使用率を効果的に削減し、

Linuxのコマンドラインで文字化けが表示される問題の解決方法 Linuxのコマンドラインで文字化けが表示される問題の解決方法 Mar 21, 2024 am 08:30 AM

Linux のコマンド ラインで文字化けが表示される問題を解決する方法 Linux オペレーティング システムでは、コマンド ライン インターフェイスの使用時に文字化けが表示されることがあり、コマンドの出力結果やファイルの通常の表示と理解に影響を及ぼします。コンテンツ。文字化けの原因としては、システムの文字セット設定が間違っている、ターミナルソフトウェアが特定の文字セットの表示をサポートしていない、ファイルのエンコード形式が一致していないなどが考えられます。この記事では、Linux コマンド ラインで表示される文字化けの問題を解決するいくつかの方法を紹介し、読者が同様の問題を解決するのに役立つ具体的なコード例を示します。

Linux ext2 ファイル システムの物理ストレージ構造についての詳細な説明 Linux ext2 ファイル システムの物理ストレージ構造についての詳細な説明 Mar 14, 2024 pm 09:06 PM

Linuxext2 ファイル システムは、ほとんどの Linux オペレーティング システムで使用されるファイル システムであり、効率的なディスク ストレージ構造を使用してファイルとディレクトリのストレージを管理します。 Linuxext2 ファイル システムの物理ストレージ構造を詳しく調べる前に、まずいくつかの基本概念を理解する必要があります。 ext2 ファイル システムでは、データはファイル システム内で割り当て可能な最小単位であるデータ ブロック (ブロック) に格納されます。各データ ブロックのサイズは固定で、通常は 1KB、2KB、または 4KB です。

Linux でのドライブの自動マウント Linux でのドライブの自動マウント Mar 20, 2024 am 11:30 AM

Linux オペレーティング システムを使用していて、システムが起動時にドライブを自動的にマウントするようにしたい場合は、デバイスの一意の識別子 (UID) とマウント ポイントのパスを fstab 構成ファイルに追加することでこれを行うことができます。 fstab は、/etc ディレクトリにあるファイル システム テーブル ファイルで、システムの起動時にマウントする必要があるファイル システムに関する情報が含まれています。 fstab ファイルを編集すると、システムを起動するたびに必要なドライブが正しくロードされるようになり、システムの安定した動作が保証されます。ドライバーの自動マウントはさまざまな場面で便利に使えます。たとえば、システムを外部ストレージ デバイスにバックアップする予定です。自動化を実現するには、起動時であってもデバイスがシステムに接続されたままであることを確認してください。同様に、多くのアプリケーションは直接

Linux のプロセスがスリープするのはなぜですか? Linux のプロセスがスリープするのはなぜですか? Mar 20, 2024 pm 02:09 PM

Linux のプロセスがスリープするのはなぜですか? Linux オペレーティング システムでは、さまざまな理由や条件によりプロセスが休止状態になることがあります。プロセスが休止状態にあるときは、プロセスが一時的に中断され、特定の条件が満たされるまで実行を続行できないことを意味し、その後起動して実行を継続できます。次に、Linux でプロセスが休止状態に入るときの一般的な状況をいくつか詳しく紹介し、具体的なコード例で説明します。 I/O の完了を待機中: プロセスが I/O 操作 (読み取りなど) を開始したとき

Linux の「.a」ファイルを作成して実行する Linux の「.a」ファイルを作成して実行する Mar 20, 2024 pm 04:46 PM

Linux オペレーティング システムでファイルを操作するには、開発者がファイル、コード、プログラム、スクリプトなどを効率的に作成および実行できるようにするさまざまなコマンドとテクニックを使用する必要があります。 Linux 環境では、拡張子「.a」を持つファイルは静的ライブラリとして非常に重要です。これらのライブラリはソフトウェア開発において重要な役割を果たし、開発者が複数のプログラム間で共通の機能を効率的に管理および共有できるようにします。 Linux 環境で効果的なソフトウェア開発を行うには、「.a」ファイルの作成方法と実行方法を理解することが重要です。この記事では、Linux の「.a」ファイルのインストールと構成方法を包括的に紹介します。Linux の「.a」ファイルの定義、目的、構造、作成および実行方法について見てみましょう。 Lとは何ですか

See all articles