code: func ServeConn(block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*Listener, error) {
  	l := new(Listener)
  	l.conn = conn
  	l.sessions = make(map[string]*UDPSession)
  	l.chAccepts = make(chan *UDPSession, acceptBacklog)
  	l.chSessionClosed = make(chan net.Addr)
  	l.die = make(chan struct{})
  	l.dataShards = dataShards
  	l.parityShards = parityShards
  	l.block = block
  	l.fecDecoder = newFECDecoder(rxFECMulti*(dataShards+parityShards), dataShards, parityShards)
  
  	// calculate header size
  	if l.block != nil {
  		l.headerSize += cryptHeaderSize
  	}
  	if l.fecDecoder != nil {
  		l.headerSize += fecHeaderSizePlus2
  	}
  
  	go l.monitor()
  	return l, nil
  }
docs: // ServeConn serves KCP protocol for a single packet connection.