Skip to content

Multicast support#614

Merged
kazu-yamamoto merged 5 commits into
haskell:masterfrom
gev:master
May 11, 2026
Merged

Multicast support#614
kazu-yamamoto merged 5 commits into
haskell:masterfrom
gev:master

Conversation

@gev
Copy link
Copy Markdown
Contributor

@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"    

@kazu-yamamoto kazu-yamamoto requested review from kazu-yamamoto and removed request for kazu-yamamoto May 11, 2026 02:34
Copy link
Copy Markdown
Collaborator

@kazu-yamamoto kazu-yamamoto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a nice work!

@kazu-yamamoto kazu-yamamoto merged commit fe9fcd2 into haskell:master May 11, 2026
1 check passed
@kazu-yamamoto
Copy link
Copy Markdown
Collaborator

Merged.
Thank you!

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.

2 participants