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에서는 작동하지 않습니다. 이 동작을 설명하는 권위 있는 소스를 찾을 수 없습니다.
아래는 수락 플래그에 대한 간단한 데모입니다.
장치 1에서 다음 명령을 사용하여 실행합니다(인터페이스 이름을 장치 이름으로 바꿉니다):
으아악장치 2에서 다음 명령을 사용하여 실행합니다(인터페이스 이름을 장치의 인터페이스 이름으로 바꿉니다):
으아악 으아악위 내용은 멀티캐스트가 golang의 Linux에서 작동하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Linux的发行版有很多,这里罗列7个漂亮的Linux发行版,可以说是Linux操作系统界的颜值担当了。elementaryOS网站:https://elementaryos.cnelementaryOS操作系统是最漂亮的Linux发行版之一。它基于macOS外观,同时为Linux用户提供了出色的用户体验。如果用户已经习惯使用macOS,则使用elementaryOS不会有任何问题。另外,elementaryOS操作系统基于Ubuntu,因此用户也可以轻松找到大量应用程序来完成任务。elemen

内核空间和用户空间对于32位操作系统而言,它的寻址空间(也称为虚拟地址空间或线性地址空间)大小为4G(即2的32次方)。这意味着一个进程可以拥有最大4G的地址空间。操作系统的核心是内核(kernel),它是与普通应用程序分离的,有权限访问受保护的内存空间和底层硬件设备。为了保证内核的安全,现代操作系统通常限制用户进程直接操作内核。通常,这通过将虚拟地址空间划分为两个部分来实现,即内核空间和用户空间。就Linux操作系统而言,最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)被

linux系统下svn安装方式常见有3种:1、使用操作系统预编译的软件包工具,如在“Ubuntu/Debian”上使用“sudo apt-get update”“sudo apt-get install subversion”进行安装;2、从源代码编译安装,官网下载源代码然后在Linux终端执行命令进行编译和安装;3、使用第三方包管理器如“Yum”进行安装,注意依赖项问题即可。

一、前言在学习Linux操作系统时,你是否曾经有过这样的疑问:为什么我们的电脑能够识别并使用不同的USB设备呢?为什么Linux系统不会把鼠标当成键盘来使用呢?让我们一起来探讨一下USB设备在Linux系统中的识别和加载过程。二、USB设备的识别和加载当我们将一个USB设备插入电脑时,Linux内核会自动检测并加载相应的驱动程序,使设备能够正常工作。接下来,我们将深入探讨USB设备在Linux系统中的识别和加载过程。2.1USB控制器检测设备插入USB控制器是一个硬件设备,用于控制USB总线上的

在这里为大家介绍一下统信uos安装的配置要求,统信uos是一款基于Linux内核的国产操作系统,具有稳定、安全、易用等特点,因此在国内得到了广泛的应用,为了确保统信uos的顺利安装和运行,我们需要了解它的配置要求。硬件配置统信uos的安装对硬件有一定的要求,具体如下:处理器:x86或x86_64架构的处理器,建议使用主频在1GHz以上的处理器。内存:至少2GB内存,建议使用4GB或以上内存。硬盘:至少20GB可用空间的硬盘,建议使用SSD固态硬盘以提高系统运行速度。显卡:支持DirectX9.0

如果一个系统被多个用户使用,你或许出于个人原因想在文件管理器中隐藏一些文件或文件夹不让其他人看到(绝大多数用户不会对Linux系统进行深入了解,所以他们只会看到文件管理器列出的文件和文件夹),我们有三种方法可以来做这件事。此外,(除了隐藏)你还可以使用密码保护文件或文件夹。在这个教程中,我们将讨论如何用非重命名的方法在文件管理器中隐藏文件和文件夹。我们都知道,通过以点(“.”)前缀重命名一个文件或文件夹的方式,可以在Linux中将该文件或文件夹隐藏。但这不是隐藏文件或文件夹的正确/高效方式。一些

在Unix或Linux操作系统上,scp实用程序(securecopy)与更著名的命令cp类似,但用于在安全加密的网络上在主机之间传输文件和目录。由于它依赖于ssh进行数据传输,因此它提供了相同的安全性并使用了相同的身份验证ssh。与rcp不同,scp命令将提示您输入用于身份验证的密码(如果需要)。在本文中,我们将深入研究Linux中文件的安全传输,并学习如何使用scp命令。通过对常用scp开关和选项的详细解释和示例用例,您将了解如何使用此实用程序。在开始之前了解以下这些很重要由于scp依赖于s


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版
시각적 웹 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
