func newLspServer(port int, params *LspParams) (*LspServer, error) { if params == nil { params = &LspParams{5, 2000} } hostport := fmt.Sprintf("localhost:%v", port) addr, err := lspnet.ResolveUDPAddr("udp", hostport) if lsplog.CheckReport(1, err) { return nil, err } udpconn, err := lspnet.ListenUDP("udp", addr) if lsplog.CheckReport(1, err) { return nil, err } else { lsplog.Vlogf(1, "[server] listen on %v\n", addr.String()) } srv := &LspServer{ server{ nextConnId: 1, params: params, connMap: make(map[string]*lspConn), udpConn: udpconn, udpAddr: addr, netReadChan: make(chan *udpPacket), appWriteChan: make(chan *LspMsg), appReadChan: make(chan *LspMsg), closeChan: make(chan uint16), closeAllChan: make(chan chan error), removeConnChan: make(chan uint16), }, } go srv.loopServe() go srv.loopRead() return srv, nil }
func newLspClient(hostport string, params *LspParams) (*LspClient, error) { if params == nil { params = &LspParams{5, 2000} } addr, err := lspnet.ResolveUDPAddr("udp", hostport) if lsplog.CheckReport(1, err) { return nil, err } udpConn, err := lspnet.DialUDP("udp", nil, addr) if err != nil { lsplog.Vlogf(1, "[client] connect to %v failed: %v\n", addr.String(), err) return nil, err } else { lsplog.Vlogf(1, "[client] connected to %v\n", addr.String()) } removeChan := make(chan uint16) appReadChan := make(chan *LspMsg) conn := newLspConn(params, udpConn, addr, 0, appReadChan, removeChan) cli := &LspClient{ client{ udpConn: udpConn, addr: addr, conn: conn, netReadChan: make(chan *LspMsg), appWriteChan: make(chan *LspMsg), appReadChan: appReadChan, connIdChan: make(chan uint16, 1), removeConnChan: removeChan, closeChan: make(chan error), }, } go cli.loopServe() go cli.loopRead() return cli, nil }