Skip to content

Multicast support#614

Open
gev wants to merge 5 commits intohaskell:masterfrom
gev:master
Open

Multicast support#614
gev wants to merge 5 commits intohaskell:masterfrom
gev:master

Conversation

@gev
Copy link
Copy Markdown

@gev gev commented May 6, 2026

Add multicast.

Tested on Linux, Windows, Mac OS.

Example:

module Discovery.Scanner where

import Control.Exception
import Control.Monad
import Data.List.NonEmpty qualified as NE
import Network.Socket
import Network.Socket.ByteString

runScanner :: HostName -> HostName -> ServiceName -> IO ()
runScanner host group port = do
    host' <- resolve host
    group' <- resolve group
    let multicast = MulticastGroup (hostAddress group'.addrAddress) Nothing
    bracket (socket AF_INET Datagram defaultProtocol) close \sock -> do
        bind sock host'.addrAddress
        setSockOpt sock AddMembership multicast
        forever do
            msg <- recv sock 1024
            print msg
  where
    resolve addr = NE.head <$> getAddrInfo Nothing (Just addr) (Just port)

hostAddress :: SockAddr -> HostAddress
hostAddress (SockAddrInet _ addr) = addr
hostAddress _ = error "Unsupported socket address"
module Discovery.Annoncer where

import Control.Concurrent
import Control.Exception
import Control.Monad
import Data.List.NonEmpty qualified as NE
import Network.Socket
import Network.Socket.ByteString

runAnnoncer :: HostName -> ServiceName -> IO ()
runAnnoncer group port = do
    group' <- resolve group
    bracket (socket AF_INET Datagram defaultProtocol) close \sock -> do
        forever do
            sendAllTo sock "hello" group'.addrAddress
            threadDelay 1_000_000
  where
    resolve addr = NE.head <$> getAddrInfo Nothing (Just addr) (Just port)
import Control.Concurrent.Async
import Control.Monad
import Discovery.Annoncer
import Discovery.Scanner

main :: IO ()
main = void $ concurrently
    do runAnnoncer "239.0.0.1" "2026"
    do runScanner "0.0.0.0" "239.0.0.1" "2026"    

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant