func iNewLspClient(hostport string, params *LspParams) (*LspClient, error) { client := new(LspClient) client.WBchan = make(chan *LspMessage, 1) client.Echan = make(chan int, 1) client.EchanBack = make(chan int, 1) client.Rchan = make(chan int) client.Wchan = make(chan int, 1) client.CloseChan = make(chan int, 1) client.CloseChanEpoch = make(chan int, 1) client.CloseNetworkChan = make(chan int, 1) client.RBchan = make(chan *LspMessage) client.eventHandClosedChan = make(chan int, 1) client.Nchan = make(chan *LspMessage, 1) client.established = make(chan int) client.writeEnded = make(chan int, 1) client.writeList = new(list.List) client.readList = new(list.List) client.errChan = make(chan error, 1) client.exitEpochHandler = make(chan int, 1) client.continueEpochHandler = make(chan int, 1) client.AckWrite = true client.allowWrite = true client.sn = 1 client.rcvn = 1 client.id = 0 client.NbWrite = 0 if params == nil { client.params = &LspParams{5, 2000} } else { client.params = params } addr, errResolve := lspnet.ResolveUDPAddr("udp", hostport) if errResolve != nil { return nil, errResolve } connexion, errDial := lspnet.DialUDP("udp", nil, addr) if errDial != nil { return nil, errDial } client.conn = connexion client.running = true msg, _ := buildMSG(MsgCONNECT, 0, 0, nil) client.writeList.PushBack(msg) client.NbWrite++ client.lastWrite = msg client.Wchan <- 1 client.epochCount = 0 client.eventHandClosed = false go NetworkHandlerClient(client) go EpochHandlerClient(client) go EventHandlerClient(client) <-client.established return client, 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") }