func iNewLspServer(port int, params *LspParams) (*LspServer, error) { srv := new(LspServer) srv.nextId = 1 if params == nil { // Insert default parameters params = &LspParams{5, 2000} } srv.params = params hostport := fmt.Sprintf(":%v", port) addr, err := lspnet.ResolveUDPAddr("udp", hostport) if lsplog.CheckReport(1, err) { return nil, err } srv.udpConn, err = lspnet.ListenUDP("udp", addr) if lsplog.CheckReport(1, err) { return nil, err } srv.readBuf = NewBuf() // Need enough room to recycle close messages srv.appReadChan = make(LspMessageChan, 1) srv.appWriteChan = make(LspMessageChan) srv.netInChan = make(networkChan) srv.epochChan = make(chan int) srv.connById = make(map[uint16]*lspConn) srv.connByAddr = make(map[string]*lspConn) srv.closeReplyChan = make(chan error, 1) srv.closeAllReplyChan = make(chan error, 1) srv.writeReplyChan = make(chan error, 1) go srv.serverLoop() go srv.udpReader() go epochTrigger(srv.params.EpochMilliseconds, srv.epochChan, &srv.stopGlobalNetworkFlag) return srv, nil }
func UDPResolve(hostport string) (*lspnet.UDPAddr, error) { lsplog.Vlogf(3, "Attempting to resolve address of %s", hostport) a, e := lspnet.ResolveUDPAddr(NET, hostport) if e != nil { lsplog.CheckFatal(e) return nil, e } lsplog.Vlogf(3, "Address %s resolved", hostport) return a, nil }
func iNewLspClient(hostport string, params *LspParams) (*LspClient, error) { cli := new(LspClient) if params == nil { // Insert default parameters params = &LspParams{5, 2000} } cli.params = params addr, err := lspnet.ResolveUDPAddr("udp", hostport) if lsplog.CheckReport(1, err) { return nil, err } cli.lspConn = newConn(addr, 0, 0) // Client's first received message will be data message. cli.lspConn.nextRecvSeqNum = NextSeqNum(0) cli.udpConn, err = lspnet.DialUDP("udp", nil, addr) if lsplog.CheckReport(1, err) { return nil, err } // Need enough room to recycle close messages at end cli.appReadChan = make(LspMessageChan, 2) cli.readBuf = NewBuf() cli.appWriteChan = make(LspMessageChan, 1) cli.netInChan = make(LspMessageChan, 1) cli.epochChan = make(chan int) cli.closeReplyChan = make(chan error, 2) cli.writeReplyChan = make(chan error, 2) go cli.clientLoop() go cli.udpReader() go epochTrigger(cli.params.EpochMilliseconds, cli.epochChan, &cli.lspConn.stopNetworkFlag) // Send connection request to server nm := GenConnectMessage() cli.udpWrite(nm) cli.lspConn.pendingMsg = nm cli.lspConn.nextSendSeqNum = NextSeqNum(0) cm := <-cli.appReadChan if cm.Type == MsgCONNECT { return cli, nil } return nil, lsplog.MakeErr("Connection failed") }