package ssdp
import (
"bytes"
"fmt"
"net"
"github.com/koron/go-ssdp/internal/multicast"
)
func AnnounceAlive (nt , usn string , location any , server string , maxAge int , localAddr string , opts ...Option ) error {
locProv , err := toLocationProvider (location )
if err != nil {
return err
}
cfg , err := opts2config (opts )
if err != nil {
return err
}
conn , err := multicast .Listen (&multicast .AddrResolver {Addr : localAddr }, cfg .multicastConfig .options ()...)
if err != nil {
return err
}
defer conn .Close ()
addr , err := multicast .SendAddr ()
if err != nil {
return err
}
msg := &aliveDataProvider {
host : addr ,
nt : nt ,
usn : usn ,
location : locProv ,
server : server ,
maxAge : maxAge ,
}
if _ , err := conn .WriteTo (msg , addr ); err != nil {
return err
}
return nil
}
type aliveDataProvider struct {
host net .Addr
nt string
usn string
location LocationProvider
server string
maxAge int
}
func (p *aliveDataProvider ) Bytes (ifi *net .Interface ) []byte {
return buildAlive (p .host , p .nt , p .usn , p .location .Location (nil , ifi ), p .server , p .maxAge )
}
var _ multicast .DataProvider = (*aliveDataProvider )(nil )
func buildAlive(raddr net .Addr , nt , usn , location , server string , maxAge int ) []byte {
b := new (bytes .Buffer )
b .WriteString ("NOTIFY * HTTP/1.1\r\n" )
fmt .Fprintf (b , "HOST: %s\r\n" , raddr .String ())
fmt .Fprintf (b , "NT: %s\r\n" , nt )
fmt .Fprintf (b , "NTS: %s\r\n" , "ssdp:alive" )
fmt .Fprintf (b , "USN: %s\r\n" , usn )
if location != "" {
fmt .Fprintf (b , "LOCATION: %s\r\n" , location )
}
if server != "" {
fmt .Fprintf (b , "SERVER: %s\r\n" , server )
}
fmt .Fprintf (b , "CACHE-CONTROL: max-age=%d\r\n" , maxAge )
b .WriteString ("\r\n" )
return b .Bytes ()
}
func AnnounceBye (nt , usn , localAddr string , opts ...Option ) error {
cfg , err := opts2config (opts )
if err != nil {
return err
}
conn , err := multicast .Listen (&multicast .AddrResolver {Addr : localAddr }, cfg .multicastConfig .options ()...)
if err != nil {
return err
}
defer conn .Close ()
addr , err := multicast .SendAddr ()
if err != nil {
return err
}
msg , err := buildBye (addr , nt , usn )
if err != nil {
return err
}
if _ , err := conn .WriteTo (multicast .BytesDataProvider (msg ), addr ); err != nil {
return err
}
return nil
}
func buildBye(raddr net .Addr , nt , usn string ) ([]byte , error ) {
b := new (bytes .Buffer )
b .WriteString ("NOTIFY * HTTP/1.1\r\n" )
fmt .Fprintf (b , "HOST: %s\r\n" , raddr .String ())
fmt .Fprintf (b , "NT: %s\r\n" , nt )
fmt .Fprintf (b , "NTS: %s\r\n" , "ssdp:byebye" )
fmt .Fprintf (b , "USN: %s\r\n" , usn )
b .WriteString ("\r\n" )
return b .Bytes (), nil
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .