package network import ( "StoreBackEnd/pkg/protocol/repository" "StoreBackEnd/pkg/protocol/rules/writers" "fmt" "net" "time" ) // CreateClientMulticast Méthode de construction d'un instance de la stuct ClientMulticast func CreateClientMulticast(address string, domain string, port int, second time.Duration, repository *repository.ProtocolRepository) ClientMulticast { return ClientMulticast{ address: address, domain: domain, port: port, second: second, repository: repository, } } // ClientMulticast Cette structure représente une communication en multicast. // TODO : Prévoir une fermeture de la connection (con.Close()) type ClientMulticast struct { // address Adresse de multicast address string // address Domain de du StoreBackEnd domain string // port Port de connexion en unicast port int // second Temps en seconde entre chaque ping second time.Duration // Repository de protocol permettant de repository *repository.ProtocolRepository } // Run Cette méthode démarre une commmunication multicast func (client ClientMulticast) Run() { addr, failedRA := client.ResolveAddr() if failedRA { return } con, failedDU := client.DialUdp(addr) if failedDU { return } cmd, correct := client.repository.ExecuteWriter(writers.HelloRulePrefix, client.domain, fmt.Sprintf("%d", client.port)) if !correct { println("[ClientMulticast] Hello rule isn't correct (" + cmd + ")") return } for { _, _ = con.Write([]byte(cmd)) time.Sleep(time.Second * client.second) } } // ResolveAddr Permet de résoude l'addresse func (client ClientMulticast) ResolveAddr() (*net.UDPAddr, bool) { addr, errResUdp := net.ResolveUDPAddr("udp", client.address) if errResUdp != nil { println(errResUdp.Error()) return nil, true } return addr, false } // DialUdp Ouvre une connection UDP func (client ClientMulticast) DialUdp(addr *net.UDPAddr) (*net.UDPConn, bool) { con, errDial := net.DialUDP("udp", nil, addr) if errDial != nil { println(errDial.Error()) return nil, true } return con, false }